Отмена дальнейших событий Doctrine для данного экземпляра сущности

Для обработки некоторых критических ошибок в моем приложении в последний раз я установил прослушиватель Doctrine на два события: prePersist а также preRemove, Когда происходит ошибка …

  • … пока сущность сохраняется, она удаляется.
  • … в то время как объект удаляется, он сохраняется обратно.

Эти действия выполняются через …

$args->getEntityManager()->remove($args->getEntity());
$args->getEntityManager()->persist($args->getEntity());

… соответственно. Однако, если ошибка обнаружена обоими prePersist а также preRemoveсоздается цикл событий:

  1. Сущность сохраняется: prePersist срабатывает.
  2. Ошибка происходит в prePersistзвонит remove(),
  3. Сущность удаляется: preRemove срабатывает.
  4. Ошибка происходит в preRemoveзвонит persist(),
  5. Вернуться к 1.

Чтобы избежать этого, я хотел бы отменить любую дальнейшую обработку событий в моей сущности. В этом случае: когда prePersist срабатывает впервые, должно как-то отметка сущность, так что она становится независимый из цепочки событий. Если возможно, я бы хотел избежать добавления поля в мою сущность.

Есть ли способ, которым я мог бы реализовать такую ​​вещь? Или, может быть, я должен найти другой способ отменить настойчивость или удаление, в первую очередь?

3

Решение

Вы можете изменить свой код, чтобы использовать Подписчик на событие, вместо прослушивателя событий, а затем вы можете легко отслеживать любые объекты, которые имеют ошибки.

Вот некоторый псевдокод, чтобы понять идею:

class EventSubscriber implements EventSubscriber
{
private $hasErrors = [];

public function getSubscribedEvents()
{
return array(
Events::prePersist,
Events::preRemove,
);
}

public function prePersist(LifecycleEventArgs $args)
{
$entity = ...

if ($error) {
if (isset($this->hasErrors[$entity->getId()])) {
return; // don't remove entity
}

$this->hasErrors[$entity->getId()] = true;

$this->getEntityManager()->remove($entity);
}
}

public function preRemove(LifecycleEventArgs $args)
{
$entity = ...

if ($error) {
if (isset($this->hasErrors[$entity->getId()])) {
return; // don't persist entity
}

$this->hasErrors[$entity->getId()] = true;

$this->getEntityManager()->persist($entity);
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]