Почему когда подписываюсь на Doctrine.Events::preUpdate, он выполняется бесконечно?

Рейтинг: 1Ответов: 0Опубликовано: 21.05.2023

У меня есть сущности 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();
}

Ответы

Ответов пока нет.