Сохранить обновление одного документа Doctrine из preUpdate hook другого документа?

У меня есть подписчик событий для DocumentA. DocumentA имеет связанные документы типа DocumentB. Во время перехвата события жизненного цикла preUpdate для DocumentA я хотел бы обновить значение в своем DocumentB. У меня такой код:

public function preUpdate(LifecycleEventArgs $args)
{
 $document = $args->getDocument();
 if (!($document instanceof DocumentA) ||
 return;
 }

 if ($documentsB = $document->getDocumentB()) {
 $dm = $args->getDocumentManager();
 foreach (iterator_to_array($documentsB) as $docB) {
 $documentB = $dm->find(DocumentB::class, $docB->getId());
 $documentB->setFooCode();
 $dm->merge($documentB);
 }
 }
}

Я пробовал это с помощью $dm->persist($documentB) вместо использования merge(), я установил отношение DocumentA к DocumentB к cascade: {all}, и я пробовал $dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document); как для DocumentA, так и для каждого DocumentB, но я, кажется, никуда не денутся. Кажется, я не могу вызывать flush() даже для одного DocumentB, не вызывая segfault (я предполагаю, что он запускает бесконечный цикл событий preUpdate внутри событий preUpdate?)

Как сохранить изменения в связанных документах при внесении изменений в метод preUpdate для подписчика событий DocumentA?

1 ответ

Я подробно остановился на этом в одном из ваших предыдущих вопросов, но повторюсь из документации Doctrine:

  • Изменения в ассоциациях обновленного объекта никогда не допускаются в этом случае -Changes к ассоциациям переданных объектов больше не распознаются операцией flush.

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

licensed under cc by-sa 3.0 with attribution.