laravel的事件与监听器
in Laravel - 0 评论

laravel的事件与监听器

in Laravel with 0 comment

事件与监听器

简单点说就是 当你执行某个事情(下单)需要处理一个行为(发送给用户下单成功邮件信息),下单的这个行为就是一个行为,当下单成功则通过监听器告诉系统,“我触发了下单行为”,再进行处理相关发送邮箱的逻辑(事件)

这也是一种观察者模式的实现 (https://laravel-china.org/articles/3711/the-practice-of-design-pattern-observer-model)

  1. 注册事件监听器

    • 打开 App\Providers\EventServiceProvider 可以看到

        protected $listen = [
            'App\Events\Event' => [
                'App\Listeners\EventListener',
            ]
        ];
      
    • $listen 代表的是一个数组 ,

    • key 代表的是监听器

    • value 代表的是事件(消息通知)

    • 监听器目录 : App\Events

    • 消息通知: App\Listeners

      我们可以在 $listen 中添加我们的事件监听器来通过命令 php artisan event:generate 自动生成相关文件

            protected $listen = [
                    ....
                    'App\Events\UserUpdate' => [
                        'App\Listeners\UpdateUserNotification',
                    ],
                ];
      

      可以在目录下看到多出了 Events & Listeners 目录

      也可以通过 php artisan make:event UserUpdate 和 php artisan make:notification UpdateUserNotification 创建

      但必须在 App\Providers\EventServiceProvider 注册相关事件

      当触发 App\Events\UserUpdate 事件时 会执行 UpdateUserNotification

        use App\Events;
        event(new UserUpdate());  
      
  2. 使用

    我们可以尝试通过事件监听修改一下我们的 用户 名,我已经创建了相关的模型和数据

         .......
         class UserUpdate
         {
             use Dispatchable, InteractsWithSockets, SerializesModels;
    
             public $user;
             /**
             * 创建一个监听器.
             *
             * @return void
             */
             public function __construct(User $user)   //  将当前要改的用户注入到 监听器中  -- 监听器会通过 EventServiceProvider 自动执行 UpdateUserNotification
             {
                 $this->user = $user;
             }
    
         }
    
    
         --------------------
    
         ....
         class UpdateUserNotification
         {
             public function __construct()
             {
                 //
             }
    
             /**
             * Handle the event.
             *
             * @param  UserUpdate  $event
             * @return void
             */
             public function handle(UserUpdate $event)  // event 就是执行的 UserUpdate 的 $this
             {
                 $event->user->update([          // 触发更新
                     'name' => 'abcd'
                 ]);
             }
             .....
         }
    
         ----------------------------
    
         php artisan tinker 
    
         >>> event(new App\Events\UserUpdate(App\Models\User::find(1)));
         => [
             null,
         ]
         >>> App\Models\User::find(1);
         => App\Models\User {#2875
             id: 1,
             name: "abcd",
             email: "yvonne.considine@example.org",
             created_at: "2018-09-25 15:11:54",
             updated_at: "2018-09-27 06:27:19",
         }
         >>>
    

    当然 , 你可以在 $listen 中添加一个value ,它就会执行你指定的第二个事件

    阻止事件传播的话,你可以在 handler 中返回 false 来停止执行


将 事件 推送到 队列中

  1. 哈哈哈,很简单

             ....
         use Illuminate\Contracts\Queue\ShouldQueue;
    
         class UpdateUserNotification implements ShouldQueue
         {
             ....
         }
    

    引入这个 队列的接口即可,当事件执行后,会自动推送到队列中

    当然还可以在当中添加一个自己指定的 队列驱动 and 队列名称

             ....
    
             /**
             * 任务将被推送到的连接名称.
             * *
             @var string|null
             */
             public $connection = 'sqs';
             /**
             * 任务将被推送到的连接名称.
             * *
             @var string|null
             */
             public $queue = 'listeners';
    

--- 总体而言就是这么多,很简单,

记住,一定要记得分发事件,也就是在EventServiceProvider中 添加相关信息,

在上面有讲到


-- 原创 转载请注明出处

Responses