@tukreb

Audit log (История действий), лучший вариант?

Добрый день.

Хочу на некоторые действия в symfony сделать гибкую историю изменению.
Вопрос в том, как лучше это сделать.
1. В самой сущности "Entity" повесить event:
class Entity
{
    //поля сущности
    private array $events = [];
    protected function recordEvent(object $event): void
    {
        $this->events[] = $event;
    }

    public function someAction($blal): void
    {
        //что-то делаем
        $this->recordEvent(new Event\LogSomeMadeAction($args)); //эвент на сохранения записи в бд
    }
}

2. В сервисе где и происходит все основные вызовы методов сущностей:
class ServiceHandler
{
    public function handle($args): void
    {
        $entity->someAction($blal);
        //логируем в бд без всяких эвентов
       
    }
}

3. Всё это делать в самих контроллерах, вместе с Monolog.

Я думаю в сторону 1 варианта, он выглядит более гибким, но хорошее ли это решение?
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
Все события агрегата должны помещаться в самом корне агрегата, как в варианте 1, но при этом метод который будет применять эти события должен вызываться после того как данные будут сохранить.

Другими словами в $eventsвы складываете все события при работе с сущностью-агрегатом, а в Handler проходите по этому массиву и отправляете в EventDispatcher каждое событие. Ну а там уже делаете подписчиков событий лога, если нужно. Главное, чтобы все события попадали в диспетчер после того, как данные будут сохранены в базу. Иначе может получится так, что возникла ошибка и сработала роллбек транзакции, откатив все изменения, а события при этом уже ушли.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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