Мне нужна ваша помощь, чтобы решить небольшую проблему.
Я пытаюсь зарегистрировать объект журнала с событием onflush. У меня есть рабочее решение для создания, редактирования или удаления сущности.
Но теперь я хочу зарегистрировать объект id, когда был вставлен новый объект. Событие onflush не управляет идентификатором, когда он был вызван Doctrine Lyfecylce. https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#onflush
Поэтому я должен попытаться работать с событием postflush. У меня есть объект id, но я не знаю, как его сохранить.
Вот небольшой код:
public function getSubscribedEvents()
{
return array(
Events::onFlush,
Events::postFlush,
);
}
public function postFlush(PostFlushEventArgs $args)
{
$this->log->setObjectId($this->element->getId());
dump($this->element->getId()); // return element ID
dump($this->log->getObjectId()); // return log attribute
// no data has been saved
}
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
if (sizeof($uow->getScheduledEntityInsertions()) > 0)
$this->logEntityChangeSets($em, $uow, Log::STATUS_INSERT, $uow->getScheduledEntityInsertions());
$uow->computeChangeSets();
}
public function logEntityChangeSets(EntityManager $em, UnitOfWork $uow, $status, Array $array)
{
// code for create Log entity and fill it
}
Благодарим за терпение и помощь.
В настоящее время я хочу сохранить объект журнала в той же базе данных.
В этом случае у вас хорошее начало, но просто убедитесь, что вы игнорируете onFlush для своих объектов Log (которые также будут проходить через поток persist/flush). Еще одна вещь, на которую следует обратить внимание, - это выполненные запросы DQL - обновления, выполненные таким образом, не проходят через методы жизненного цикла объекта и, следовательно, не будут записаны.
Итак, после события onflush просто обновите последний объект журнала с помощью команды DQL, чтобы игнорировать жизненный цикл доктрины? Думаю, это не лучшая практика: /




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