Сохраняться внутри onFlush слушателя Symfony - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сохранить одну сущность внутри слушателя 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: превышено максимальное время выполнения 300 секунд в applis / vendor / doctrine / orm / lib / Doctrine / ORM / UnitOfWork.php в строке 653, реферер: http://website/

у кого-нибудь есть решение / способ?

С уважением

РЕДАКТИРОВАТЬ 1:

Изменение $ em на $ uow не вносит никаких изменений ...

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

1 Ответ

0 голосов
/ 19 сентября 2018

Это отслеживает изменения в сущности 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);
            }
        }
    }
}
...