Представим, что есть большой, работающий проект на Laravel. Необходимо разработать функционал логирования активности в админке. Любая активность пользователя (в CRUD и не только) должна попадать в лог. В админку нужно будет добавить страницу, чтобы видеть логи. На этой страничке должен быть поиск по логам (строка поиска), фильтр по датам и по автору (тот кто делал изменения).
В табличке должна быть информация: кто инициатор действия, и человеческое понятный комментарий (например: Изменено значение имени «Иван» => «Ivan» у пользователя id = 250 (тут 250 должно быть ссылкой на пользователя). Так же иногда комментарии могут быть не только в рамках CRUD. Например: Вход в админку; Сгенерировал отчет; и т.д. Потенциально таких действий может быть очень много и по мере роста функционала действий будет становиться больше.
Ваша задача описать как бы Вы реализовали задачу с архитектурной точки зрения?
Ответ
Вот какие шаги надо сделать для этого:
Шаг 1. Создать миграцию и таблицу для логирования. В ней будут поля даты и времени, описание события, а также имя пользователя, который это выполнил.
Шаг 2. Создание в моделях обработчиков, которые будут перехватывать событие создание, изменения и удаления данных. Лучше это вынести в отдельный трейт, чтобы соблюсти условия SOLID и DRY. Например, вот так:
protected static function boot()
{
// на событие добавление
static::created(function ($model) {
self::Addlog('create', $model, null, $model->getAttributes());
});
// на событие обновления
static::updated(function ($model) {
self::Addlog('update', $model, $model->getOriginal(), $model->getChanges());
});
// на событие удаления
static::deleted(function ($model) {
self::Addlog('delete', $model, $model->getOriginal(), null);
});
}
В статическом методе AddLog осуществить добавление данных в таблицу лога. Предварительно обработав русские тексты в транслитацию, чтобы такое «Иван»стало таким «Ivan». И указать данные кода, со ссылкой на просмотр данной записи лога. Например роут будет выглядеть таким образом:
Route::get('/log/{id}', [LogController::class, ‘DetaulLog'])->name('detail_log');
Шаг 3. Подключить трейт к моделям, чтобы они правильно обрабатывали данные.
Шаг 4. Для логирования входа и выхода в админку создать события в файле EventServiceProvider
Создать командами прослушивание
php artisan make:listener LogSuccessfulinput --event=Login
php artisan make:listener LogSuccessfuloutput --event=Logout
В файое EventServiceProvider прописать:
protected $listen = [
Login::class => [
LogSuccessfulinput::class,
],
Logout::class => [
LogSuccessfuloutput::class,
],
];
В методе handle данных классов прописать событие добавление данных в таблицу лога. Сделать такую же аналогичную обработку, как в шаге 2.
Шаг 5. Для событий генераций отчетов или каких-то других специфических действий, можно написать индивидуальную вставку записи в таблицу лога.
Резюмируя вышесказанное: Выполнение задачи зависит от того, какая система используется и как она будет реализована? Будет ли это самописная система или какая-то готовая CMS? Конкретные шаги реализации зависят от особенностей архитектуры CMS.