Для того чтобы получить изменения в единичных ассоциациях (single associations) в событии onFlush в Doctrine event listener, нужно изучить информацию о состоянии объектов, которые были изменены во время действия транзакции.
Событие onFlush происходит перед фиксацией изменений в базе данных и предоставляет доступ к измененным объектам, которые хранятся в EntityManager-е. Во время этого события можно получить доступ к состоянию объектов через метод getUnitOfWork() у EntityManager, а затем использовать метод getEntityChangeSet для получения изменений в определенных ассоциациях.
Пример кода может выглядеть следующим образом:
use DoctrineORMEventOnFlushEventArgs; class YourEventListener { public function onFlush(OnFlushEventArgs $eventArgs) { $entityManager = $eventArgs->getEntityManager(); $unitOfWork = $entityManager->getUnitOfWork(); foreach ($unitOfWork->getScheduledEntityUpdates() as $entity) { $changeset = $unitOfWork->getEntityChangeSet($entity); // Проверяем, содержит ли changeset изменения в конкретной ассоциации (связи) if (array_key_exists('associationName', $changeset)) { $oldValue = $changeset['associationName'][0]; $newValue = $changeset['associationName'][1]; // делаем что-то с новым и старым значением } } } }
В приведенном коде мы получаем scheduled entity updates из UnitOfWork и проходимся по каждому измененному объекту. Затем, используя метод getEntityChangeSet, мы получаем changeset для каждого объекта и проверяем содержит ли он изменения в конкретной ассоциации с помощью array_key_exists. Если да, то мы можем получить старое значение до изменения и новое значение после изменения из changeset и производить необходимые действия.
Важно отметить, что событие onFlush вызывается для всех измененных объектов, поэтому нужно учитывать, что изменения в ассоциациях могут быть связаны с различными объектами. Кроме того, обратите внимание, что этот пример относится к Doctrine ORM для Symfony. Для других версий Doctrine или других фреймворков, способы доступа к изменениям в ассоциациях могут быть различными.