我有一个相对简单的更改日志记录类,用于存储日期,一个用于指示更改类型的整数和用于保存更改的旧数据和新数据的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();
}
}
为什么会出现问题?
答案 0 :(得分:0)
我认为您的问题是$entity->setUpdatedDate();
调用,可能会调用另一个更新事件并重新调用您的处理程序。
答案 1 :(得分:0)
Doctrine只有一个生命周期事件过程,因此无论您在生命周期事件中添加刷新使用的实体,都会将您回到循环中并再次进入事件处理程序......并再次......和..
基本上答案是使用
$eventManager -> removeEventListener('preUpdate', $this);
删除该事件。然后创建新实体,持久化,刷新并最终重新附加您所在的事件。
$eventManager -> addEventListener('preUpdate', $this);