首页 > 解决方案 > 教义:有没有办法仅在事务提交后处理“postRemove”?

问题描述

从数据库中删除实体本身后,我想删除与给定实体相关的文件。Doctrine 的“postRemove”事件似乎非常适合这种情况,除非删除发生在事务中。如果我在删除实体后回滚事务 - 文件将被删除,但实体将保留在数据库中。

我正在从事的项目是一个非常大的项目,并且该实体被广泛使用。通常它也会通过“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”文件将被删除,但实体仍将保留。

我想要实现的是:回滚时文件和实体都保留,提交时它们都被删除。

标签: phpmysqlsymfonydoctrine-orm

解决方案


推荐阅读