【问题标题】:Persist inside onFlush listener symfony坚持在 onFlush 监听器 symfony
【发布时间】:2018-09-19 07:58:14
【问题描述】:

我正在尝试在 onFlush 侦听器中保留一个实体... 这是我的代码:

    public function onFlush(OnFlushEventArgs $args){

    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();

    foreach ($uow->getScheduledEntityUpdates() as $entity) {
        switch (true) {
            case $entity instanceof Products:

                $changeset = $uow->getEntityChangeSet($entity);

                foreach($changeset as $column => $change) {
                            $logs = new Logs();
                            $logs->setDate(new DateTime());


                            $em->persist($logs);
                            $classMetadata = $em->getClassMetadata('BddBundle:Logs');
                            $uow->computeChangeSet($classMetadata, $logs);
                        }
                    }
                }
                break;
            default : break;
        }
    }
}

问题是程序块(没有插入数据库的行)和 PHP 说:

PHP 致命错误:applis/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 第 653 行的最大执行时间超过 300 秒,引用者:http://website/

有人有解决方案/方法吗?

问候

编辑 1:

将 $em 更改为 $uow 不会进行任何更改...

             $uow->persist($logs);
                    $classMetadata = $em->getClassMetadata('BddBundle:Logs');
                    $uow->computeChangeSet($classMetadata, $logs);

【问题讨论】:

  • 计算一次变更集,而不是在循环内。这是疯狂,这不是斯巴达。你为什么要添加switch(true) 反正太哈哈,这没有任何意义。
  • @emix :我只是将 switch 更改为 if 语句,现在我只坚持一次,但同样的问题......

标签: symfony listener persist


【解决方案1】:

这会监视User 实体的变化,并将一些数据插入UserLog 实体。根据您的需要进行调整。

use Doctrine\ORM\Event\OnFlushEventArgs;

class UserEntityListener
{
    public function onFlush(OnFlushEventArgs $args)
    {
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if ($entity instanceof User) {
                $userLog = new UserLog();
                $userLog->setUserId($entity->getId());
                $userLog->setMessage('onFlush - update at ' . date('d/m/Y H:i:s'));

                $em->persist($userLog);
                // Instead of $em->flush() because we are already in flush process
                $uow->computeChangeSet($em->getClassMetadata(get_class($userLog)), $userLog);
            }
        }
    }
}

【讨论】:

  • 它不应该循环。我个人在我的应用程序中使用完全相同的东西。您的应用程序中可能有不同的问题。检查这个:inanzzz.com/index.php/post/oymp/…
  • 您也可以通过inanzzz.com/index.php/post/ew0r/…查看已更改的字段。
  • 我检查了这些链接,但我不知道为什么......它总是无限循环......
  • 如果您将entity 的每个实例替换为document,此示例也适用于Doctrine 的ODM。
猜你喜欢
  • 2016-10-16
  • 2019-04-09
  • 2014-06-29
  • 2016-02-09
  • 1970-01-01
  • 2015-09-02
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多