coderisimo
@coderisimo

Как получить изменения в single associations в onFlush в doctrine event listener?

В третий раз закинул он невод )).
Путем исследований обнаружил, что если я хочу сохранять что-то новое (например, лог изменений сущностей) в doctrine event listener , то я должен делать это в onFlush используя $unitOfWork->computeChangeSet...Но

Я могу получить в onFlush добавленные и удаленные сущности. Я могу получить в onFlush коллекции ассоциаций. Но Я совершенно не понимаю, как получить там же ОДИНОЧНЫЕ АССОЦИАЦИИ (вернее, их изменения). Казалось бы, если есть первое и второе, то уж и третье должно быть доступно, ан xxxxxx.......

Другими словами мне нужно в onFlush то, что есть в preUpdate - PreUpdateEventArgs. Сохранять что-то в preUpdate категорически не рекомендуется и не работает. Получается интересная ситуация :
Сохранить лог во onFlush я могу, но там нет нужной информации.
Сохранить лог в preUpdate я не могу, хотя там есть все что мне нужно.

Буду благодарен за советы.
Спасибо
  • Вопрос задан
  • 365 просмотров
Решения вопроса 1
coderisimo
@coderisimo Автор вопроса
Напишу здесь, чтобы был ответ, который возможно кому-то еще сэкономит время и НЕВРЫ.
Спасибо BoShurik !!!! см. подробности топике

Простые ассоциации доступны в onFlush через
$unitOfWork->getEntityChangeSet($entity);

далее
$metaData = $entityManager->getClassMetadata(get_class($entity));
            //отбираем ассоциации "не коллекции" и только изменненные.
            $singleAssociations = array_filter($metaData->getAssociationNames(), function ($association) use ($metaData) {
                return $metaData->isSingleValuedAssociation($association);
            });

            $data = [];
            foreach ($changesSet as $key => $field) {
                if (in_array($key, $singleAssociations)) {
// где $field[0] и $field[1] будут как раз простыми ассоциациями "до" и "после"
//getAssocFieldValue - просто метод который берет из ассоциации нужное простое значение для  лога
                    $data[$key] = [$this->getAssocFieldValue($field[0]), $this->getAssocFieldValue($field[1])];
                } 
            }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sHinE
@sHinE
веб-разработчик, php/js/mysql и сопутствующее
У меня, по-моему, была не совсем такая ситуация, но похожая ситуация.
Создаётся один класс, который реализует EventSubscriber и в нём прописываются два метода, которые вам нужны (preUpdate и onFlush ).
В вашем случае в preUpdate сохраняете в свойство класса данные, которые вам надо сохранить, а уже в onFlush читаете их из этого свойства и сохраняете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы