symfony2达到最大功能嵌套级别'100',中止!与doctrine eventlistener [英] symfony2 Maximum function nesting level of '100' reached, aborting! with doctrine eventlistener
问题描述
我有eventlistener preUpdate
I have eventlistener 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:错误:达到最大功能嵌套级别'100',中止!在/var/www/issue/app/cache/dev/classes.php行6123
in / var / www / issue / app / cache / dev / classes.php line 6123 at
/ var / www / issue / vendor / symfony / symfony / src / Symfony /中的handleHandler-> handleFatal() Component / HttpKernel / Debug / ErrorHandler.php
在NormalizerFormatter-> normalize()中的行0在
/var/www/issue/app/cache/dev/classes.php行6198
LineFormatter-> normalize()in /var/www/issue/app/cache/dev/classes.php
line 6112 at NormalizerFormatter-> format()in
/ var / www / issue / app / cache / dev / classes.php line 6172 at
LineFormatter-> format()in /var/www/issue/app/cache/dev/classes.php
line 6320在AbstractProcessingHandler-> handle()在
/var/www/issue/app/cache/dev/classes.php行6646
Logger-> addRecord()在/ var / www / issue / app / cache / dev / classes中。 php line
6710 at Logger-> debug()in
/var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php
第72行在DbalLogger-> log()
/var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php
第50行在
/var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php
第50行在LoggerChain-> startQuery()中,在DbalLogger-> startQuery()
/var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php
line 774在
/ var / www / issue中的Connection-> executeUpdate() /vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
在BasicEntityPersister - > _ updateTable()中的第447行
/ var / www / issue / vendor / doctrine / orm / lib /Doctrine/ORM/Persisters/BasicEntityPersister.php
第357行在BasicEntityPersister-> update()在
/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php
line 984 at UnitOfWork-> executeUpdates()in
/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php
line 317 at UnitOfWork-> commit()in
/ var / www / i ssue / vendor / doctrine / orm / lib / Doctrine / ORM / EntityManager.php
line 355 in EntityManager-> flush()in
/ var / www / issue / src / iTracker / UserBundle / Listener / UserGroupAmount.php
line 41
和此
in /var/www/issue/app/cache/dev/classes.php line 6123 at ErrorHandler->handleFatal() in /var/www/issue/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php line 0 at NormalizerFormatter->normalize() in /var/www/issue/app/cache/dev/classes.php line 6198 at LineFormatter->normalize() in /var/www/issue/app/cache/dev/classes.php line 6112 at NormalizerFormatter->format() in /var/www/issue/app/cache/dev/classes.php line 6172 at LineFormatter->format() in /var/www/issue/app/cache/dev/classes.php line 6320 at AbstractProcessingHandler->handle() in /var/www/issue/app/cache/dev/classes.php line 6646 at Logger->addRecord() in /var/www/issue/app/cache/dev/classes.php line 6710 at Logger->debug() in /var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php line 72 at DbalLogger->log() in /var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php line 50 at DbalLogger->startQuery() in /var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php line 50 at LoggerChain->startQuery() in /var/www/issue/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php line 774 at Connection->executeUpdate() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 447 at BasicEntityPersister->_updateTable() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 357 at BasicEntityPersister->update() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 984 at UnitOfWork->executeUpdates() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 317 at UnitOfWork->commit() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 355 at EntityManager->flush() in /var/www/issue/src/iTracker/UserBundle/Listener/UserGroupAmount.php line 41 and this
- 在UserGroupAmount-> preUpdate ()in
/var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php
line 61 - 在ContainerAwareEventManager - > dispatchEvent()in
/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php
line 980 - at UnitOfWork-> $ on
/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php
line 317 - 中的executeUpdates()在UnitOfWork-> commit()in
/var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php
line 355 - 在EntityManager-> flush()
/var/www/issue/src/iTracker/UserBundle/Listener/UserGroupAmount.php
第41行 - at UserGroupAmount->preUpdate() in /var/www/issue/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php line 61
- at ContainerAwareEventManager->dispatchEvent() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 980
- at UnitOfWork->executeUpdates() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 317
- at UnitOfWork->commit() in /var/www/issue/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 355
- at EntityManager->flush() in /var/www/issue/src/iTracker/UserBundle/Listener/UserGroupAmount.php line 41
这5个错误s被循环,导致这种异常
and this 5 errors are looped, which cause this exception
推荐答案
调用 flush
作者不是正确的解决方案。它将在FLASH上触发两次,并在事务中创建不必要的保存点。
Calling flush
suggested by the author is not a correct solution. It will fire onFLush twice and create unneeded savepoints in transaction.
所有其他更改可以使用 computeChangeSet
, recomputeSingleEntityChangeSet
和 scheduleExtraUpdate
方法。
All additional changes can be scheduled in events using computeChangeSet
, recomputeSingleEntityChangeSet
and scheduleExtraUpdate
methods.
一个不同的实体:
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())
));
}
}
}
调用坚持
不需要(因为在任何情况下都不会创建关联的内容,所以它们应该是持久的)。
Calling persist
is not needed (because the associated entites aren't created in any event, they should be already persistent).
这篇关于symfony2达到最大功能嵌套级别'100',中止!与doctrine eventlistener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!