symfony2达到最大功能嵌套级别'100',中止!与doctrine eventlistener [英] symfony2 Maximum function nesting level of '100' reached, aborting! with doctrine eventlistener

查看:235
本文介绍了symfony2达到最大功能嵌套级别'100',中止!与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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆