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事件系统使用