2013-03-15 33 views
3

我正在使用听众持续从原则更新doctrine PostPersist&PostUpdate in one listener

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

我能想到的唯一方法是阻止这个问题,那就是让全局变量知道我们是否坚持(创建)一个实体,而不是调用更新侦听器。

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

回答

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); 
+0

当我做'addEventListener'它似乎再次调用监听器?我在侦听器的末尾做了一个flush,我可以添加remove侦听器并且不会重新调用,但是如果我在所有东西之后添加了add listener,它似乎仍然是重复的 – 2013-03-18 10:38:04

+0

@AndrewAtkinson我不确定我是否理解。你能提供一个代码示例吗? – 2013-03-18 16:30:43

+0

没关系,几个小时就解决了,对我来说主要问题是,当我试图删除监听器时,它实际上是一个不同的对象(但同一个类),所以'$ this'不起作用。 – 2013-03-19 11:51:25