本文目录导读:

在 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 模型来记录到数据库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播