真实举例 老规矩
- 假设我们需要在用户注册成功后发送一封欢迎邮件给用户
- 首先 定义事件 App\Events\UserRegistered 、 App\Events\UserLogin
- 然后定义一个监听器 App\Listeners\SendWelcomeEmail
- 然后添加一个订阅者 App\Listeners\UserEventSubscriber
简化版本
Event::listen('App\Events\UserRegistered', function ($event) {
$user = $event->user;
// 发送欢迎邮件给用户
},function ($event) {
$user = $event->user;
// 记录日志
});
三者逻辑关系
- 监听器监听事件 类似观察者模式 观察者就是监听器 事件就是被观察者
- 订阅者 : 由于以上事件和监听器,如果想处理对应多个事件 就是用订阅者 观察者就办不到了
- 事件发布流程:
- UserRegistered 事件和 SendWelcomeEmail 监听器关联起来
- 当UserRegistered 事件被触发时,SendWelcomeEmail 监听器的 handle() 方法会被自动调用,以实现发送欢迎邮件的功能
- 事件订阅流程:
- 订阅器类 UserEventSubscriber分别将 onUserRegistered 和 onUserLoggedIn 方法注册到事件监听器中
- 当 UserRegistered 事件和 \UserLogin 事件被触发时,UserEventSubscriber 订阅器中相应的方法会被自动调用,以实现记录用户注册和登录日志的功能
代码
public function boot()
{
parent::boot();
$this->app->bind('App\Contracts\UserRegisteredleInterface', 'App\Events\UserRegisteredImplementation');
$this->listen = [
'App\Events\UserRegistered' => [
'App\Listeners\SendWelcomeEmail',
],
];
$this->subscribe = [
'App\Listeners\UserEventSubscriber@onUserRegistered',
'App\Listeners\UserEventSubscriber@onUserLoggedIn'
];
}
bind event
- 作用: 用于绑定一个事件到到一个处理器函数
- 效果: 事件被触发后处理函数会被调用
listen event
- 作用: 注册一个监听器
- 效果: 事件被触发后监听器会执行相应的操作
subscribe event
- 作用: 注册一个监听器一个事件订阅者 和观察者不同 可以订阅多个事件
- 效果: 事件被触发后监听器通知订阅者