В 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. Расширения и улучшения
- Логирование действий пользователей: можно добавить
user_idи записывать, кто именно совершил действие. - Логирование изменений полей: можно расширить метод
log()так, чтобы он принимал массив изменений и сохранял их. - Фильтрация и поиск: через обычные Eloquent-запросы можно получать логи по дате, типу действия или пользователю.
Заключение
Использование Activity Log через трейт Loggable — простой и универсальный способ отслеживать действия моделей в Laravel. Он легко расширяется и не требует сложных пакетов.
С такой реализацией вы всегда сможете понять, что происходило с данными в вашем приложении, а при необходимости добавить больше контекста к логам.


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