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

时间:2015-02-24 16:43:04

标签: symfony doctrine-orm

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

我可以创建并填充该类的实例但是当我来刷新它时,我得到一个"错误:最大功能嵌套级别为' 200'到达,流产!"错误。

我已经了解了Xdebug问题,并将最大嵌套配置为200,但正如您所看到的,这还不够。保存过程应该非常简单,并且不需要这么多嵌套函数,因此进一步增加它只会隐藏问题,无论它是什么。我在这个应用程序中有更复杂的类,persisit和flush没有问题。

问题始终在

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

仔细研究一下这个问题后,我认为问题可能是在另一个类的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();
    }

}

为什么会出现问题?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

看一下这篇博客文章 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);