Laravel 7 不支持用事件订阅者(Subscriber)批量监听 Eloquent 模型原生事件,必须改用观察者(Observer)或手动注册事件监听器;因模型事件由静态分发器触发,不经过应用事件总线,Subscriber 无法捕获。

直接说结论:Laravel 7 不支持用事件订阅者(Subscriber)批量监听 Eloquent 模型原生事件(如 creating、saving、deleting 等),必须改用观察者(Observer)或手动注册事件监听器。
为什么 EventSubscriber 不能监听模型原生事件?
Laravel 的 EventServiceProvider 中的 $subscribe 数组只接受实现了 subscribe() 方法的类,该方法接收一个 Illuminate\Events\Dispatcher 实例 —— 它只能监听「应用级事件」(即你用 event() 或 Event::dispatch() 主动触发的自定义事件,比如 UserRegistered、OrderShipped)。而 Eloquent 模型的 creating、updated 这类事件是直接由模型静态事件分发器(static::registerModelEvent())触发的,根本不会经过应用事件总线,所以 EventSubscriber 对它们完全不可见。
想批量监听模型事件,该用 Observer 而不是 Subscriber
Observer 是 Laravel 专为模型生命周期设计的批量监听机制,一个类就能响应多个模型事件,且无需手动注册每个事件:
- 用命令生成:
php artisan make:observer UserObserver --model=User - 在
UserObserver类中定义方法名与模型事件严格对应:creating()、created()、updating()、updated()、deleting()、deleted()等 - 在
AppServiceProvider::boot()中绑定:User::observe(UserObserver::class) - 注意:Observer 方法接收的是模型实例(如
User $user),不是事件对象;若需访问原始变更字段,要用$user->isDirty('email')或$user->getChanges()
如果坚持用事件系统,只能手动注册模型事件为应用事件
你可以把模型事件“桥接”进应用事件总线,再让 EventSubscriber 监听这些桥接事件,但这是额外封装,非 Laravel 原生支持:
- 在模型的
boot()中手动 dispatch:static::created(function ($user) { event(new UserCreated($user)); }); - 确保
UserCreated是标准事件类(含Dispatchabletrait) - 然后在
EventSubscriber的subscribe()方法里监听它:$events->listen(UserCreated::class, [self::class, 'onUserCreated']); - ⚠️ 风险:事务回滚时,
created已触发但数据库可能未提交;若需强一致性,应在事务外延迟处理(如队列)
真正容易被忽略的一点是:Laravel 7 的模型事件本身不走队列,哪怕监听器实现了 ShouldQueue。如果你需要异步执行(比如发邮件、调外部 API),必须显式调用 dispatch(new YourJob($user)),不能依赖事件监听器自动入队。


















