去发现生活中的美好,记录生活中的点点滴滴

laravel事件系统使用

php admin 187℃

Laravel 事件机制实现了一个简单的观察者模式,让我们可以订阅和监听应用中出现的各种事件。在EventServiceProvider的linsten数组里面加上事件和监听器,键名是事件,键值里面的数组是一个或者多个监听器,意思是当某一个事件发生的时候,传送给数组里面的那些个监听器,执行一些列操作。
下面介绍如何使用:

根目录下找到:App\Providers\EventServiceProvider.php

在listen里面加入事件和监听器:

protected $listen = [
    'App\Events\CreateOrderEvent' => [
        'App\Listeners\SendEmailEventListener',
    ],
];

执行以下命令,生成事件和监听文件(已存在的事件和监听文件不会重复生成,也不会覆盖):

php artisan event:generate

执行后生成:

App\Events\CreateOrderEvent.php;
App\Listeners\SendEmailEventListener.php;

在事件里面(参数通过事件传入到监听器):

class CreateOrderEvent{
   use Dispatchable, InteractsWithSockets, SerializesModels;
    public $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
}
 

在监听器App\Listeners\SendEmailEventListener里面的handle加入处理方法(参数从事件传入):

class SendEmailEventListener  implements ShouldQueue
{
    use InteractsWithQueue;
    public function handle(CreateOrderEvent $event)
    {
       SendEmail::send($event->data);
    }

}

触发事件:

//生成订单....
...
//处理事件及触发监听器
$data = [
     'email'=>'test@qq.com',
     'title'=>'test'
];
event(new CreateOrderEvent($data));

当事件处理完成的时候(创建订单),就会监听监听器,如果监听器里面需要执行,则处理监听器的任务(发邮件)。

至此,流程讲完。

注意:如果你的监听器中需要实现一些耗时的任务,这个时候可能就需要用到队列;要对监听器进行队列化的话,只需增加 ShouldQueue 接口到你的监听器类(implements ShouldQueue);
如果使用队列来执行和监听队列,当事件触发监听器执行任务时,属于异步处理,即使报错,也会继续执行后续操作,即如果SendEmail::send()发生异常,则不影响上层代码的继续执行;如果不使用 ShouldQueue 接口,则为同步,抛出异常的时候,同步到上层。

转载请注明:永盟博客 » laravel事件系统使用

喜欢 (0)