事件

基本用法

Lumen 的事件功能简单的使用观察者模式实现, 允许你订阅或者监听应用里面发生的事件.

订阅事件

Note: 如果你想使用 Event facade 的话, 请在 bootstrap/app.php 文件里面把 $app->withFacades()去掉注释.

使用此方法 Event::listen 来订阅事件:

  1. Event::listen(
  2. 'PodcastWasPurchased', 'EmailPurchaseConfirmation@handle'
  3. );

Note: 你可以把事件注册都写到 服务提供者 文件里面.

当一个事件触发的时候, 事件对象会把调用监听者的 handle 方法:

  1. class EmailPurchaseConfirmation {
  2. public function handle(PodcastWasPurchased $event)
  3. {
  4. //
  5. }
  6. }

你可以把监听者的类放在任何位置, 如统一放到 app/Events 文件夹里面.

触发事件

现在我们准备好使用 Event facade 触发我们的事件:

  1. $response = Event::fire(new PodcastWasPurchased($podcast));

fire 方法返回一个响应的数组,让你可以用来控制你的应用程序接下来要有什么反应。

你也可以使用 event 辅助方法来触发事件:

  1. event(new PodcastWasPurchased($podcast));

监听器闭包

你甚至可以不需对事件建立对应的处理类。举个例子,在你的 EventServiceProviderboot 方法里,你可以做下面这件事:

  1. Event::listen('App\Events\PodcastWasPurchased', function($event) {
  2. // Handle the event...
  3. });

停止继续传递事件

有时候你会希望停止继续传递事件到其他监听器。你可以通过从处理程序返回 false 来做到这件事:

  1. Event::listen('App\Events\PodcastWasPurchased', function($event) {
  2. // Handle the event...
  3. return false;
  4. });

事件处理队列

需要把事件处理程序放到 队列 里面吗?你可以使用 Illuminate\Contracts\Queue\ShouldBeQueued 接口来标识出来:

  1. use Illuminate\Contracts\Queue\ShouldBeQueued;
  2. class SendPurchaseConfirmation implements ShouldBeQueued {
  3. public function (PurchasePodcast $event)
  4. {
  5. //
  6. }
  7. }

下次当某个事件被触发的时候, 监听器就会被自动加载到事件分发器里面去了.

Note:当然, 你需要配置 队列设置 才能使用此功能.

当处理程序被队列执行,如果没有异常被丢出,在执行后该队列中的任务将会自动被删除。你也可以手动取用队列中的任务的 deleterelease 方法。队列处理程序默认会引入的 Illuminate\Queue\InteractsWithQueue trait,让你可以取用这些方法:

  1. public function handle(PodcastWasPurchased $event)
  2. {
  3. if (true) {
  4. $this->release(30);
  5. }
  6. }