Доктрина: есть ли способ обработать postRemove только после того, как транзакция будет зафиксирована? - PullRequest
1 голос
/ 03 мая 2019

Я хочу удалить файл, связанный с данным объектом, после удаления самого объекта из базы данных.Событие postRemove в Doctrine кажется идеальным для этого, за исключением случаев, когда удаление происходит внутри транзакции.Если откатить транзакцию после удаления объекта - файлы будут удалены, но объект останется в базе данных.

Проект, над которым я работаю, очень большой, и этот объект широко используется.Часто его также удаляют с помощью «cascade = remove», поэтому «соулмент« вы можете просто не использовать события и делать это каждый раз вручную »- это своего рода головная боль для реализации.

Пример:

$img = new Image();
$img->setFileName('test.jpg');
$em->persist($img);
$em->flush();

$em->beginTransaction();
$em->remove($img);
$em->flush();
$em->rollback();

Само событие будет выглядеть следующим образом:

public function postRemove(LifecycleEventArgs $args) {
    $entity = $args->getObject();
    $em = $args->getObjectManager();

    if ($entity instanceof Image && file_exists($entity->getFileName())) {
        unlink($entity->getFileName());
    }
}

После выполнения этого кода файл «test.jpg» будет удален, но объект все равно останется.

Чего я хочу добиться: при откате и файл, и объект остаются, а при фиксации оба они удаляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...