Почему когда подписываюсь на Doctrine.Events::preUpdate, он выполняется бесконечно?
У меня есть сущности Order и Notification. При изменении поля status сущности Order, я хочу создавать новое оповещение для клиента. Для этого я решил создать OrderEventSubscriber, который имплементит Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface и подписаться на Doctrine\ORM\Events::preUpdate.
Когда я создаю в preUpdate новое оповещение и сохраняю в БД через flush, preUpdate начинает вызываться бесконечно, хотя у меня в preUpdate идёт проверка изменённой сущности и если это не Order, я завершаю работу метода.
Код метода preUpdate:
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getObject();
if ($entity instanceof Order) {
$onlyStatusChanged = count($args->getEntityChangeSet()) === 1 && $args->hasChangedField('status');
if ($onlyStatusChanged) {
$this->notificationsCreator->createChangeStatusNotification($entity->getCustomer());
}
}
}
Оповещение создаётся и флашится в createChangeStatusNotification
public function createChangeStatusNotification(User $recipient)
{
$notification = new Notification();
$notification->setAction((new DataMapping())->getKeyByValue('notification_actions', 'order_status_changed'));
$notification->setRecipient($recipient);
$notification->setCreatedAt(new DateTimeImmutable('now', new DateTimeZone('Europe/Moscow')));
$this->em->persist($notification);
$this->em->flush();
}
Источник: Stack Overflow на русском