laravel 框架中的 事件 监听 和订阅

发布时间 2023-05-29 11:00:32作者: vx_guanchaoguo0

真实举例 老规矩

  • 假设我们需要在用户注册成功后发送一封欢迎邮件给用户
  • 首先 定义事件 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

  • 作用: 注册一个监听器一个事件订阅者 和观察者不同 可以订阅多个事件
  • 效果: 事件被触发后监听器通知订阅者