事件类通常被保存在 app/Events 目录下,而它们的处理程序则被保存在 app/Handlers/Events 目录下。
下面我们用artisan来创建一个事件,比如叫CqhTestEvent
php artisan make:event CqhTestEvent
<?php namespace App/Events; use App/Events/Event; use Illuminate/Queue/SerializesModels; class CqhTestEvent extends Event { use SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct() { } }
event(new CqhTestEvent());
$response = Event::fire(new CqhTestEvent());
fire 方法返回一个响应的数组,让你可以用来控制你的应用程序接下来要有什么反应。
事件处理的方法可以分别两种,分别是类和闭包。
这里我的处理类中叫CqhTestEventHandler,下面我们来用artisan来创建这个处理类
php artisan handler:event CqhTestEventHandler --event=CqhTestEvent
然后在app/Handlers/Events文件下会生成CqhTestEventHandler.php,结构如下
<?php namespace App/Handlers/Events; use App/Events/CqhTestEvent; use Illuminate/Queue/InteractsWithQueue; use Illuminate/Contracts/Queue/ShouldBeQueued; class CqhTestEventHandler { /** * Create the event handler. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param CqhTestEvent $event * @return void */ public function handle(CqhTestEvent $event) { // } }
然后我们在handle方法里加上一句
public function handle(CqhTestEvent $event) { // echo 'chenqionghe的事件被处理了'; }
这样,我们的简单的对应事件的处理就完成了
然后, 要指定相应事件的处理类也有两种方式,事件服务中指定和Event::listen()方法指定
在EventServiceProvider的boot方法中指定要处理
然后,我们需要把这个事件注册到系统服务里边,在app/Providers文件夹里有个EventServiceProvider.php我们,打开他,找到相应的listen属性,加上
如下
<?php namespace App/Providers; use Illuminate/Contracts/Events/Dispatcher as DispatcherContract; use Illuminate/Foundation/Support/Providers/EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event handler mappings for the application. * * @var array */ protected $listen = [ 'event.name' => [ 'EventListener', ], //在这里加上 'App/Events/CqhTestEvent' => [ 'App/Handlers/Events/CqhTestEventHandler', ], ]; ... }
在这里把事件给添加上,并定义相应处理事件的类(注意,这里是可以针对事件使用多个处理类的,只需要在数组里加上就行了)
Event::listen('App/Events/CqhTestEvent', 'App/Handlers/Events/CqhTestEventHandler');
注意:指定类的时候和路由是一个原理,事件处理默认会调用 CqhTestEventHandler的 handle方法,如果要指定相应方法,可以加上@方法名,如 CqhTestEventHandler@doEvent
只需要在调用事件之前指定即可
我们不可以直接用闭包来处理某个事件,只要在触发事件前定义就可以了,如在EventServiceProvider的boot方法里
Event::listen('App/Events/CqhTestEvent', function($event) { // 处理事件... });
如果定义了多个这样的事件处理,在触发事件后他们都会一并被执行,就相当于jquery里边的bind方法如,
public function getTest() { Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件1'; }); Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件2'; }); Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件3'; }); event(new CqhTestEvent()); }
上面注册了CqhTestEvent事件的三个处理,运行结果如下
触发事件1触发事件2触发事件3
同样,和jquery一样,有时候你会希望停止继续传递事件到其他监听器。你可以通过从处理程序return false 来做到这件事
public function getTest() { Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件1'; }); Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件2'; return false; }); Event::listen('App/Events/CqhTestEvent', function($event) { echo '触发事件3'; }); event(new CqhTestEvent()); }
运行结果如下
触发事件1触发事件2