我有事件侦听器preUpdate
public function preUpdate(PreUpdateEventArgs $args) {
$user = $args->getEntity();
if($user instanceof \iTracker\UserBundle\Entity\User) {
if($args->hasChangedField('userGroup')) {
$old = $args->getOldValue('userGroup');
$new = $args->getNewValue('userGroup');
$em = $args->getEntityManager();
$old->setAmount($old->getAmount() - 1);
$em->persist($old);
$new->setAmount($new->getAmount() + 1);
$em->persist($new);
$em->flush();
}
}
}
在提交表单后,我得到了FatalErrorException: Error: Maximum function nesting level of '100' reached, aborting! in /var/www/issue/app/cache/dev/classes.php line 6123
在/var/www/issue/app/cache/dev/classes.php中,ErrorHandler处的第6123行->NormalizerFormatter处的/var/www/issue/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php行0->NormalizerFormatter> /var格式中的/var/www/议题/app/cache/dev/classes.php第6198行->/var中的正常化()/www/app/cache/dev/classes.php行6172 at LineFormatter>format()格式/var/www/issue/app/cache/dev/classes.php第6320行抽象AbstractProcessingHandler>handle()在/var/www/议题/app/cache/dev/classes.php第6646行,在Logger->addRecord()中/var/www/app/app/cache/dev/classes.php第6710行在Logger-> /var/www/issue/vendor/symfony/symfony/src/Symfony中调试()/Bridge/Doctrine/Logger/DbalLogger.php第72行DbalLogger-> /var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php第50行在DbalLogger->startQuery()在/var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php第50行在LoggerChain->startQuery()在/var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php第774行连接/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php行447 at BasicEntityPersister>_updateTable()中的/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php行357 at BasicEntityPersister>update()中的/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php行984 at UnitOfWork->executeUpdates()中的/var/www/issue/->executeUpdate//var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php /ORM/lib/Doctrine/ORM/UnitOfWork.php第317行at UnitOfWork->commit()在/var/www/issue/src/iTracker/UserBundle/Listener/UserGroupAmount.php第41行中的第355行->/var/www/issue/src/iTracker/UserBundle/Listener/UserGroupAmount.php()
这5个错误被循环,这导致了这个异常。
发布于 2013-06-07 09:09:46
调用作者建议的flush
不是正确的解决方案。它将两次触发onFLush并在事务中创建不必要的保存点。
所有其他更改都可以使用computeChangeSet
、recomputeSingleEntityChangeSet
和scheduleExtraUpdate
方法对事件进行调度。
在与另一实体的情况下:
public function preUpdate(PreUpdateEventArgs $args) {
$user = $args->getEntity();
if($user instanceof \iTracker\UserBundle\Entity\User) {
if($args->hasChangedField('userGroup')) {
$old = $args->getOldValue('userGroup');
$new = $args->getNewValue('userGroup');
$oldOriginAmount = $old->getAmount();
$newOriginAmount = $new->getAmount();
$old->setAmount($old->getAmount() - 1);
$uow->scheduleExtraUpdate($old, array(
'amount' => array($oldOriginAmount, $old->getAmount())
));
$new->setAmount($new->getAmount() + 1);
$uow->scheduleExtraUpdate($new, array(
'amount' => array($newOriginAmount, $new->getAmount())
));
}
}
}
不需要调用persist
(因为在任何情况下都不会创建关联的实体,它们应该已经是持久的)。
发布于 2015-07-17 09:16:24
@meze是对的,在*刷新*事件中使用刷新将导致一个循环。
但是有一个快速的解决方法可以让您仍然这样做:$eventManager = $this -> em -> getEventManager();
// Remove event, if we call $this->em->flush() now there is no infinite recursion loop!
$eventManager -> removeEventListener('onFlush', $this);
// ...
// Re-attach since we're done
$eventManager -> addEventListener('onFlush', $this);
https://stackoverflow.com/questions/16980191
复制相似问题