学说PostPersist& PostUpdate在一个监听器中

时间:2013-03-15 17:08:15

标签: symfony doctrine listener

我正在使用听众来坚持从学说更新。

唯一的问题是,当调用侦听器时,它会创建并更新新的/当前实体, 因此,它再次调用自己,创建了两个实体。

我能想到阻止这种情况的唯一方法是拥有一个全局变量来知道我们是否持久化(创建)一个实体而不是调用使用更新侦听器。

我知道这是错误的,并且必须有一种更好的方法来创建一个更新并创建其他实体而不再调用自己的侦听器。

1 个答案:

答案 0 :(得分:5)

避免使用doctrine侦听器进行递归循环的一种方法是让侦听器在执行任何更新/持久化之前将其自身从事件管理器中删除。

因此,例如在某些代码中,我曾经做过类似的事情:

// $evm is the Event Manager grabbed from the Entity Manager that
// is part of the Event passed to the listener function
public function removeThyself($evm)
{
    $evm->removeEventListener(Events::postFlush, $this);
    $evm->removeEventListener(Events::onFlush, $this);
}

public function readdTheyself($evm)
{
    $evm->addEventListener(Events::postFlush, $this);
    $evm->addEventListener(Events::onFlush, $this);
}

这些函数从侦听器注册的任何事件中删除事件侦听器。

然后在从影响数据库的侦听器做任何事情之前,我调用它们以确保不会调用事件侦听器。 e.g。

// $em is the Entity Manager, $evm is the Event Manager
$this->removeThyself($evm);
$em->flush($toFlush);
$this->readdTheyself($evm);