gpt4 book ai didi

symfony - 一个监听器中的 PostPersist 和 PostUpdate Doctrine

转载 作者:行者123 更新时间:2023-12-02 16:52:42 24 4
gpt4 key购买 nike

我正在使用监听器来坚持根据 Doctrine 进行更新。

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

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

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

最佳答案

避免 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);
}

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

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

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

关于symfony - 一个监听器中的 PostPersist 和 PostUpdate Doctrine ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com