Доктрина: Как подавить дальнейшие события жизненного цикла при обновлении сущностей внутри слушателя сущности? - PullRequest
0 голосов
/ 30 августа 2018

Я работаю над приложением в Symfony 3, используя Doctrine.

Всякий раз, когда я сохраняю или обновляю конкретную сущность, мне нужно запрашивать подмножество этих сущностей (того же класса) и обновлять свойство для каждой.

В настоящее время у меня есть класс прослушивателя сущностей с обработчиками postPersist () и postUpdate (), которые вызывают функцию, выполняющую вышеупомянутое поведение.

Однако я обнаружил, что при сохранении изменений для этих других сущностей он вызывает события, приводящие к дополнительным обратным вызовам жизненного цикла для postUpdate () на том же слушателе (как и ожидалось, но нежелательно).

Я хотел бы спросить, не знает ли кто-нибудь о способе подавления этих дополнительных событий или, возможно, есть какие-либо идеи относительно альтернативных решений этого сценария.

Обновление : предоставление примера кода, помогающего проиллюстрировать проблему

// Subscribed Entity Listener for Foo
class FooListener
{

  ...

  public function postPersist(Foo $foo, LifecycleEventArgs $event)
  {
    ...

    $this->updateFlaggedFoos($event);
  }

  public function postUpdate(Foo $foo, LifecycleEventArgs $event)
  {
    ...

    $this->updateFlaggedFoos($event);
  }

  private function updateFlaggedFoos(LifecycleEventArgs $event)
  {
    $user          = $this->tokenStorage->getToken()->getUser();
    $entityManager = $event->getEntityManager();
    $userFoos      = $entityManager->getRepository('MyApp:Foo')->getUserFoos($user);

    foreach($userFoos as $foo) {
      if ($this->determineIfFlagValueNeedsToChange($foo)) {
        $foo->setFlagValue( ! $foo->isFlagged());
        $entityManager->persist($foo);   // Causes postUpdate() to be called again.
      }
    }
  }

  ...

}
...