ООО "Солнечный Ветер" Ларионов Андрей Николаевич
Создатель проекта: ООО "Солнечный Ветер" Ларионов Андрей Николаевич
Логирование системы CRUD в Laravel

Логирование системы CRUD в Laravel


Автор: admin Дата: 2025-09-19 06:20:18

Тестовое задание:

Представим, что есть большой, работающий проект на 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.

Если вы считаете текст данного блога оскорбительным или некорректным, напишите об этом по адресу IntegralAL@mail.ru с URL-адресом блога. В теме письма пишите <Жалоба>, либо <Неккоректно>.

Теги блога:

Программирование
Web-программирование
Web-сайт
Назад к блогам