我已经设置了一个学说EntityListener。我需要在postRemove
事件中执行一些必须超出任何学说事务的代码。但是:
public function postRemove(Image $image, LifecycleEventArgs $event)
{
$isActive = $event->getEntityManager()->getConnection()->isTransactionActive();
dump($isActive);
}
始终转储 true 。
无论我是在postRemove()方法中提交还是刷新;我尝试在preRemove()中启动事务并在postRemove()中提交它,但这没有帮助。
问题:有没有办法阻止Doctrine将postRemove()包装到事务中?如果不是,那么执行代码的最佳方法是什么?我不在乎它是立即发生还是在内核终止时,只要它最终发生。
我有一个想法是在EntityListener中创建一个析构函数方法,并在Listener析构时运行代码,但我不知道它有多可靠。也许还有其他(更好的)选择?
谢谢!
答案 0 :(得分:1)
听起来你想要刷新或坚持,这不是你想在postRemove事件中做的事情。
来自文档:
此处的更改与数据库中的持久性无关, 但您可以使用这些事件来更改不可持久的项目,例如 非映射字段,日志记录甚至非关联类 由Doctrine直接映射。
因此,此事件不适用于使用entitymanager执行操作。
请改用onFlush listener。您可以捕获已删除实体的实例并执行适当的操作。请仔细阅读文档,尤其是以下限制适用于onFlush事件部分
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush