本文目录导读:

是的,Laravel 观察者(Observer)可以监听多个事件,你可以在同一个观察者类中定义多个方法,每个方法对应一个 Eloquent 模型事件。
支持的事件类型
Laravel 观察者支持以下 Eloquent 事件:
retrieved- 查询到模型后creating- 创建前created- 创建后updating- 更新前updated- 更新后saving- 保存前(创建或更新)saved- 保存后(创建或更新)deleting- 删除前deleted- 删除后restoring- 软删除恢复前restored- 软删除恢复后forceDeleted- 强制删除后
示例代码
<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class UserObserver
{
// 创建前
public function creating(User $user)
{
Log::info('正在创建用户', ['email' => $user->email]);
}
// 创建后
public function created(User $user)
{
Log::info('用户创建成功', ['id' => $user->id]);
// 可以在这里执行其他操作,比如发送欢迎邮件
}
// 更新前
public function updating(User $user)
{
Log::info('正在更新用户', ['old_email' => $user->getOriginal('email')]);
}
// 更新后
public function updated(User $user)
{
Log::info('用户更新成功', ['id' => $user->id]);
}
// 删除前
public function deleting(User $user)
{
// 在删除用户之前清理相关数据
$user->posts()->delete();
$user->comments()->delete();
}
// 删除后
public function deleted(User $user)
{
Log::info('用户已删除', ['id' => $user->id]);
}
// 查询后
public function retrieved(User $user)
{
Log::info('查询到用户', ['id' => $user->id]);
}
}
注册观察者
在 AppServiceProvider 的 boot 方法中注册:
<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 方式1:注册单个事件
User::observe(UserObserver::class);
// 方式2:使用 observe 方法直接定义多个事件
User::observe([
UserObserver::class,
// 还可以注册其他观察者
]);
}
}
选择性监听事件
如果你只想监听特定事件,不需要为所有事件都定义方法:
class UserObserver
{
// 只监听创建和删除事件
public function created(User $user) { /* ... */ }
public function deleted(User $user) { /* ... */ }
// 不需要为每个事件都写方法
}
使用 Events 属性(Laravel 8.x+)
对于更复杂的场景,可以使用 $events 属性:
class UserObserver
{
// 定义事件映射
public $events = [
'App\Events\UserCreated' => 'handleUserCreated',
'App\Events\UserUpdated' => 'handleUserUpdated',
];
public function handleUserCreated($event)
{
// 处理自定义事件
}
}
观察者非常适合用于将模型相关的业务逻辑分离,使代码更清晰、可维护。