监听模型事件
通过静态方法
- 在模型类上调用要监听事件对应的静态方法
- 通常在某个服务提供者的 boot 方法中完成静态调用
通过模型观察者
- 优点
- 订阅者处理模型事件的简化版本,不需要自定义事件类,不需要建立映射关系
- 只需要在观察者类中将需要监听的事件定义为同名方法,并在相应方法中编写业务处理代码 - 执行
- 某个模型事件触发,
- Eloquent 底层去该模型上注册的观察者类中通过反射查找是否定义了对应的方法
- 若定义了则执行相应的逻辑,否则忽略
- 使用
- 生成模型观察者类
-php artisan make:observer UserObserver --model=User
- 将观察者注册到模型类上
- 在 EventServiceProvider 的 boot 方法内User::observe(UserObserver::class)
- 生成模型观察者类
通过订阅者自定义监听器
- 创建对应的事件类
- 将Eloquent支持的模型事件与自定义的事件类建立映射关系,
$dispatchesEvents
属性
- 将模型原生的事件处理逻辑转移到自定义事件类上 - 将事件类注册到监听类中,完成模型事件监听闭环
- 监听自定义事件类
- 方式一 在EventServiceProvider
的listen
属性中为每个事件绑定对应的监听器类
- 方式二 为某个模型类创建一个事件订阅者类来统一处理该模型中的所有事件
1. 在app/Listeners
目录下创建一个UserEventSubscriber.php
文件作为订阅者类
2. 在事件服务提供者EventServiceProvider
中注册这个订阅者
-$subscribe
属性数组注册订阅者类
事件订阅者类约定
- 作用:监听器注册及定义
- 定义对应的事件监听器方法
on + 事件类名
- 实现订阅方法
subscribe
,为订阅者注册监听器,处理多个监听器- 该方法内注册监听器
$events->listen(event_cls, event_listen_method)
- 该方法内注册监听器
- 事件类接受事件模型实例以构造方法的形式注入
Eloquent 模型事件应用场景
- 只是监听一两个模型事件,通过静态方法监听模型事件合适
- 仅仅监听系统支持的模型事件,并且要监听多个模型的多个事件,观察者最佳选择
- 监听更多系统模型事件之外的自定义事件,则使用订阅者来监听比较合适