Symfony2 错误在另一个实体的 preUpdate 事件中刷新一个实体

Symfony2 error Flushing an entitiy within the preUpdate event of another entiity

我有一个相对简单的更改日志记录 class,它存储日期、一个指示更改类型的整数和 2 个保存更改的旧数据和新数据的 varchar(50)。

我可以创建并填充 class 的实例,但是当我刷新它时,我收到 "Error: Maximum function nesting level of '200' reached, aborting!" 错误。

我已经阅读了 Xdebug 问题并将最大嵌套配置为 200,但如您所见,这还不够。保存过程应该很简单,不需要那么多嵌套函数,所以再增加它只会隐藏问题,不管它是什么。我在这个应用程序中有更复杂的 classes 可以毫无问题地坚持和刷新。

问题总是在

NormalizerFormatter ->normalize() 在 app/cache/dev/classes.php 第 4912 行 -

仔细研究了一下,我认为问题可能是在另一个 class:

的 preUpdate 事件期间创建并保存了更改实例
public function preUpdate(LifecycleEventArgs $eventArgs)
{
    $entity = $eventArgs->getEntity();
    if ($entity instanceof Property) {
        $entityManager = $eventArgs->getEntityManager();
        $changeArray = $eventArgs->getEntityChangeSet();
        foreach ($changeArray as $field => $values) {
            $eventType = "";
            switch ($field) {
                case 'price' :
                    $eventType = PropertyEvent::EVENTTYPE_PRICE;
                BREAK;    
                case 'status' :
                    $eventType = PropertyEvent::EVENTTYPE_STATUS;
                BREAK;    
            }
            if ($eventType != "") {
                $event = new PropertyEvent($entity->getID(), $eventType, $values[0], $values[1]);
                $entityManager->persist($event);
                $entityManager->flush();
            }
        }
        $entity->setUpdatedDate();
    }

}

为什么这会成为一个问题?

我认为您的问题是 $entity->setUpdatedDate(); 调用,它可能会调用另一个更新事件并重新调用您的处理程序。

Doctrine 只有一个生命周期事件进程,因此无论您使用的是什么实体,在生命周期事件中添加刷新都会将您送回循环并再次进入您的事件处理程序……又一次……和...

看看这个博客post http://mightyuhu.github.io/blog/2012/03/27/doctrine2-event-listener-persisting-a-new-entity-in-onflush/

基本上答案是使用

$eventManager -> removeEventListener('preUpdate', $this);

删除事件。然后创建新实体,坚持,刷新并最终重新附加您所在的事件。

$eventManager -> addEventListener('preUpdate', $this);