Вы используете не тех слушателей, чтобы реализовать то, что вы хотите сделать.Цитирование из 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).