Для обработки некоторых критических ошибок в моем приложении в последний раз я установил прослушиватель Doctrine на два события: prePersist
а также preRemove
, Когда происходит ошибка …
Эти действия выполняются через …
$args->getEntityManager()->remove($args->getEntity());
$args->getEntityManager()->persist($args->getEntity());
… соответственно. Однако, если ошибка обнаружена обоими prePersist
а также preRemove
создается цикл событий:
prePersist
срабатывает.prePersist
звонит remove()
,preRemove
срабатывает.preRemove
звонит persist()
,Чтобы избежать этого, я хотел бы отменить любую дальнейшую обработку событий в моей сущности. В этом случае: когда prePersist
срабатывает впервые, должно как-то отметка сущность, так что она становится независимый из цепочки событий. Если возможно, я бы хотел избежать добавления поля в мою сущность.
Есть ли способ, которым я мог бы реализовать такую вещь? Или, может быть, я должен найти другой способ отменить настойчивость или удаление, в первую очередь?
Вы можете изменить свой код, чтобы использовать Подписчик на событие, вместо прослушивателя событий, а затем вы можете легко отслеживать любые объекты, которые имеют ошибки.
Вот некоторый псевдокод, чтобы понять идею:
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);
}
}
}
Других решений пока нет …