Symfony 后波斯特主义;在一个侦听器中进行姿势更新

Symfony 后波斯特主义;在一个侦听器中进行姿势更新,symfony,doctrine,listener,Symfony,Doctrine,Listener,我正在使用一个侦听器来持久化和从教义更新 唯一的问题是,当调用侦听器时,它会创建并更新一个新的/当前的实体, 因此,它再次调用自己,它创建了两个实体 我认为阻止这种情况的唯一方法是使用一个全局变量,该变量将知道我们是否在持久化(创建)一个实体,而不是调用使用更新侦听器 我知道这是错误的,必须有更好的方法来创建一个监听器,该监听器更新并创建其他实体,而无需再次调用自己。避免使用条令监听器进行递归循环的一种方法是,在进行任何更新/持久化之前,让监听器从事件管理器中删除自己 例如,在我编写的一些代码中

我正在使用一个侦听器来持久化和从教义更新

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

我认为阻止这种情况的唯一方法是使用一个全局变量,该变量将知道我们是否在持久化(创建)一个实体,而不是调用使用更新侦听器


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

避免使用条令监听器进行递归循环的一种方法是,在进行任何更新/持久化之前,让监听器从事件管理器中删除自己

例如,在我编写的一些代码中,我有如下内容:

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

当我做
addEventListener
时,它似乎又在调用侦听器了?我在侦听器的末尾进行刷新,我可以在中添加删除侦听器,它不会重新调用,但是如果我在所有事情之后添加添加侦听器,它似乎仍然可以duplicate@AndrewAtkinson我不太明白。你能提供一个代码示例吗?没关系,几个小时后就解决了,我的主要问题是,当我试图删除侦听器时,它实际上是一个不同的对象(但是同一个类),所以“$this”不起作用。