从数据库中删除实体本身后,我想删除与给定实体相关的文件。为此,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”文件将被删除,但实体仍将保留。
我想要实现的是:在回滚时,文件和实体都保留,并且在提交时,它们都被删除。