Laravel模型事件记录日志吗

wen PHP项目 1

本文目录导读:

Laravel模型事件记录日志吗

  1. 在模型中使用 boot() 方法(最直接)
  2. 使用观察者类(Observer,推荐用于复杂场景)
  3. 如需更专业的日志管理(推荐生产环境)

在 Laravel 中,模型事件本身不会自动记录日志,但你可以很方便地利用模型事件来实现日志记录功能

Laravel 提供了模型事件(如 created, updated, deleted 等),你可以监听这些事件,并在事件触发时手动编写代码来记录日志。

以下是几种常见的实现方式:

在模型中使用 boot() 方法(最直接)

在每个模型里,重写 boot() 方法,并监听事件,在闭包中记录日志。

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
class User extends Model
{
    protected static function boot()
    {
        parent::boot();
        // 当用户被创建时记录日志
        static::created(function ($user) {
            Log::info('用户创建成功', ['user_id' => $user->id, 'email' => $user->email]);
        });
        // 当用户被更新时记录日志
        static::updated(function ($user) {
            Log::info('用户信息更新', [
                'user_id' => $user->id,
                'changed_fields' => $user->getDirty() // 获取发生变化的字段
            ]);
        });
        // 当用户被删除时记录日志
        static::deleted(function ($user) {
            Log::warning('用户被删除', ['user_id' => $user->id, 'name' => $user->name]);
        });
    }
}

使用观察者类(Observer,推荐用于复杂场景)

当需要在一个地方管理多个模型的事件,或者记录逻辑比较复杂时,建议使用观察者。

步骤 1:创建观察者

php artisan make:observer UserObserver --model=User

步骤 2:在观察者中编写日志逻辑

<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class UserObserver
{
    public function created(User $user)
    {
        Log::channel('model_events')->info('用户创建', ['data' => $user->toArray()]);
    }
    public function updated(User $user)
    {
        Log::channel('model_events')->info('用户更新', [
            'original' => $user->getOriginal(), // 更新前的数据
            'changes'  => $user->getChanges()   // 更新后的数据
        ]);
    }
    public function deleted(User $user)
    {
        Log::channel('model_events')->warning('用户删除', ['data' => $user->toArray()]);
    }
    // 还有 restored(), forceDeleted() 等事件
}

步骤 3:在 AppServiceProvider 中注册观察者

<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

如需更专业的日志管理(推荐生产环境)

如果你需要将模型变更记录到数据库(而非只是日志文件),可以考虑:

  • 使用数据包(Package):如 spatie/laravel-activitylog,它会自动记录模型的创建、更新、删除等操作,并存储到 activity_log 表中,支持自定义描述和因果关系。
  • 构建自己的日志模型(Activity Log):创建一个 ActivityLog 模型和对应的数据库表,在观察者中向该表写入记录。

示例(使用 spatie/laravel-activitylog):

// 安装后,在模型中加入 trait
use Spatie\Activitylog\Traits\LogsActivity;
class User extends Model
{
    use LogsActivity;
    protected static $logAttributes = ['*']; // 记录所有字段
    protected static $logName = 'user';       // 日志名称
}
方式 适用场景 日志存储
boot() 方法 简单、少量模型 文件(Log::info
Observer 观察者 复杂逻辑、管理多个模型 文件或数据库
专业 Package 需要审计、追溯、UI 查看 数据库

推荐做法:如果只是开发调试,使用 boot() 快速记录到日志文件;如果是生产环境需要审计功能,建议使用 spatie/laravel-activitylog 或自己构建 Activity Log 模型来记录到数据库。

抱歉,评论功能暂时关闭!