3

我正在使用侦听器来坚持更新教义。

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

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

我知道这是错误的,必须有更好的方法来创建一个监听器,它可以更新和创建其他实体,而无需再次调用自己。

4

1 回答 1

5

避免与学说侦听器发生递归循环的一种方法是让侦听器在进行任何更新/持久之前从事件管理器中删除自己。

例如,在我处理过的一些代码中,我有这样的东西:

// $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);
}

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

然后在从影响数据库的侦听器执行任何操作之前,我调用这些以确保不会调用事件侦听器。例如

// $em is the Entity Manager, $evm is the Event Manager
$this->removeThyself($evm);
$em->flush($toFlush);
$this->readdTheyself($evm);
于 2013-03-15T17:38:25.943 回答