Попытка сохранить другую сущность в preUpdate - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь сохранить другую сущность в моем прослушивателе событий preUpdate, но он не работает ...

Вот мой код:

public function preUpdate(LifecycleEventArgs $args) {
    $entity        = $args->getEntity();
    $em = $args->getEntityManager();
    $uow           = $em->getUnitOfWork();
    $session       = new Session();
    $newLog = new Log();
    $newLog->setDate(new DateTime());

    if(!empty($this->toBePersisted))
    {
       array_push($toBePersisted, $historique);
    }
    else
    {
       $toBePersisted[0] = $historique;
    }
}


    public function postFlush(PostFlushEventArgs $event)
{
    if(!empty($this->toBePersisted)) {

        $em = $event->getEntityManager();

        foreach ($this->toBePersisted as $element) {

            $em->persist($element);
        }

        $this->toBePersisted = [];
        $em->flush();
    }
}

Но мой новый журнал неупорствовал ... Есть ли у вас решение?

С уважением

1 Ответ

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

Вы используете не тех слушателей, чтобы реализовать то, что вы хотите сделать.Цитирование из Doctrine документации для события postFlush:

postFlush вызывается в конце EntityManager # flush ().EntityManager # flush () нельзя вызывать безопасно внутри своих слушателей.

Правильный способ реализовать то, что вы хотите, - это событие onFlush, которое является более мощным событием доктрины, но НЕ является обратным вызовом жизненного цикла.Поэтому вы должны правильно настроить слушателя в файле services.yaml:

App\EventListener\LogListener:
    tags:
        - { name: doctrine.event_listener, event: onFlush }

, а затем в событии onFlush:

class LogListener {

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

    foreach ($uow->getScheduledEntityUpdates() as $entity) {
        if (!$entity instanceof YourUpdatedEntity) {
            return;
        }

        $newLog = new Log();
        $newLog->setDate(new DateTime());
        $em->persist($newLog);
        $classMetadata = $em->getClassMetadata(Log::class);
        $uow->computeChangeSet($classMetadata, $newLog);
    }
}

}

Требуется вызов функции computeChangeSet, поскольку, как указано вдокументация для события onFlush:

Если вы создаете и сохраняете новую сущность в onFlush, то вызова EntityManager # persist () недостаточно.Вы должны выполнить дополнительный вызов $ unitOfWork-> computeChangeSet ($ classMetadata, $ entity).

...