Activity Log в Laravel: простой способ вести журнал действий моделей

от автора

в
Время чтения: 2 мин.

В Laravel часто возникает необходимость отслеживать изменения моделей — кто что делал, когда были выполнены действия, и т.д. Один из простых и эффективных способов реализовать это — создать Activity Log, используя полиморфные связи.

Шаг 1. Создание модели ActivityLog

Для начала создадим модель ActivityLog, которая будет хранить записи действий:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ActivityLog extends Model
{
    protected $fillable = [
        'description',
    ];
}

В данной модели достаточно одного поля description, в котором мы будем хранить описание действия. При желании можно добавить поля user_id, ip_address, created_at для более детального логирования.

Также потребуется миграция:

Schema::create('activity_logs', function (Blueprint $table) {
    $table->id();
    $table->morphs('loggable'); // Для полиморфной связи
    $table->text('description');
    $table->timestamps();
});

Поле morphs('loggable') создаёт loggable_id и loggable_type, что позволяет привязывать логи к любой модели.


Шаг 2. Создание трейта Loggable

Чтобы любой Eloquent-моделью можно было удобно вести лог, создадим трейт Loggable:

<?php

namespace App\Traits;

use App\Models\ActivityLog;

trait Loggable
{
    public function logs()
    {
        return $this->morphMany(ActivityLog::class, 'loggable');
    }

    public function log(string $description)
    {
        return $this->logs()->create(compact('description'));
    }
}
  • Метод logs() создаёт полиморфное отношение morphMany, которое связывает любую модель с её логами.
  • Метод log($description) создаёт новую запись в журнале для конкретной модели.

Шаг 3. Использование трейта

Теперь можно подключить трейт к любой модели, для которой нужно вести логи:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Traits\Loggable;

class Post extends Model
{
    use Loggable;

    protected $fillable = ['title', 'content'];
}

Создание записи в лог очень простое:

$post = Post::find(1);

// Логируем действие
$post->log('Создан новый пост');

// Можно добавить ещё действия
$post->log('Пост обновлён пользователем 12');

Получение всех логов для модели:

$logs = $post->logs;

foreach ($logs as $log) {
    echo $log->description . PHP_EOL;
}

Шаг 4. Расширения и улучшения

  1. Логирование действий пользователей: можно добавить user_id и записывать, кто именно совершил действие.
  2. Логирование изменений полей: можно расширить метод log() так, чтобы он принимал массив изменений и сохранял их.
  3. Фильтрация и поиск: через обычные Eloquent-запросы можно получать логи по дате, типу действия или пользователю.

Заключение

Использование Activity Log через трейт Loggable — простой и универсальный способ отслеживать действия моделей в Laravel. Он легко расширяется и не требует сложных пакетов.

С такой реализацией вы всегда сможете понять, что происходило с данными в вашем приложении, а при необходимости добавить больше контекста к логам.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 8 + 6?