在onFlush侦听器symfony中持久化

在onFlush侦听器symfony中持久化,symfony,listener,persist,Symfony,Listener,Persist,我试图在onFlush侦听器中保留一个实体。。。 这是我的代码: public function onFlush(OnFlushEventArgs $args){ $em = $args->getEntityManager(); $uow = $em->getUnitOfWork(); foreach ($uow->getScheduledEntityUpdates() as $entity) { switch (true)

我试图在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致命错误:第653行的applis/vendor/doctrine/orm/lib/doctrine/orm/UnitOfWork.PHP中超过了300秒的最大执行时间,请参考:

有人有解决方案/方法吗

问候

编辑1:

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

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

这将监视
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);
            }
        }
    }
}

计算更改集一次,而不是在循环内。这是疯狂,这不是斯巴达。为什么你添加了
switch(true)
呢?哈哈,这没有任何意义。可能是@emix的重复:我只是将switch改为if语句,现在我只保留了一次,但同样的问题……它不应该循环。我个人在我的应用程序中使用了完全相同的东西。您的应用程序中可能存在不同的问题。检查此项:您也可以检查此项以检查已更改的字段。我检查了这些链接,但我不知道为什么。。。它总是无限循环……如果您将
实体
的每个实例替换为
文档
,则此示例也适用于Doctrine的ODM。