общее описание прожекта
Несвежий крупный проект на Symfony 4.4 и MongoDB. Doctrine ODM 2.2.3.
У сущности Заказа есть дочерние сущности "Задача", которые бывают разных типов.
При изменении статуса у Задачи типа-А с "X" на "Y", надо у Задачи типа-Б того же Заказа, тоже изменить статус, если текущий имеет значение "K" — на "L".
TL&DR Когда меняется определённым образом один документ, нужно что-то поменять в другом документе.
В обработчике
события preUpdate
, и вроде бы, только в его
аргументах, можно сравнить старое и новое прилетевшее значение искомого поля. Но из этого же
preUpdate
менять другой док. / создавать новый — как я понял, нельзя.
Поэтому можно сохранять в классе обработчика массив кандидатов на изменения. И при другом событии, postPersist или postFlush ? – эти изменения уже воплощать.
Но что-то у меня пока не получается. В обработчике postFlush я нахожу нужный документ, меняю ему поля, добавляю ему в коллекцию новый вложенный под-объект. Но и
$dm->persist($doc)
и пляски с unitOfWork и
recomputeSingleDocumentChangeSet()
не сохраняют желаемые изменения в базе.
Что я делаю не так, и может, Listeners – не лучшее место для такой задачи?
P.S. тега "Doctrine ODM" тут нет, поэтому пришлось поставить "Doctrine ORM". События и аргументы слушателей
наследуются от них, в любом случае.