防止Doctrine EntityListener postRemove被包装在事务中

时间:2016-03-28 21:21:08

标签: transactions doctrine symfony

我已经设置了一个学说EntityListener。我需要在postRemove事件中执行一些必须超出任何学说事务的代码。但是:

public function postRemove(Image $image, LifecycleEventArgs $event)
{
    $isActive = $event->getEntityManager()->getConnection()->isTransactionActive();
    dump($isActive);
}

始终转储 true

无论我是在postRemove()方法中提交还是刷新;我尝试在preRemove()中启动事务并在postRemove()中提交它,但这没有帮助。

问题:有没有办法阻止Doctrine将postRemove()包装到事务中?如果不是,那么执行代码的最佳方法是什么?我不在乎它是立即发生还是在内核终止时,只要它最终发生。

我有一个想法是在EntityListener中创建一个析构函数方法,并在Listener析构时运行代码,但我不知道它有多可靠。也许还有其他(更好的)选择?

谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你想要刷新或坚持,这不是你想在postRemove事件中做的事情。

来自文档:

  

此处的更改与数据库中的持久性无关,   但您可以使用这些事件来更改不可持久的项目,例如   非映射字段,日志记录甚至非关联类   由Doctrine直接映射。

因此,此事件不适用于使用entitymanager执行操作。

请改用onFlush listener。您可以捕获已删除实体的实例并执行适当的操作。请仔细阅读文档,尤其是以下限制适用于onFlush事件部分

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush