Laravel - 事件处理



事件提供了一个简单的观察者实现,允许用户订阅和监听 Web 应用中触发的各种事件。所有 Laravel 中的事件类都存储在 **app/Events** 文件夹中,监听器存储在 **app/Listeners** 文件夹中。

在 Web 应用中生成事件和监听器的 Artisan 命令如下所示:

php artisan event:generate

此命令将事件和监听器生成到上面讨论的相应文件夹中。

Event Generator

事件和监听器提供了一种很好的方式来解耦 Web 应用,因为一个事件可以有多个监听器,而这些监听器彼此独立。Artisan 命令创建的事件文件夹包含以下两个文件:event.php 和 SomeEvent.php。它们显示如下:

Event.php

<?php
namespace App\Events;
abstract class Event{
   //
}

如上所述,**event.php** 包含类 **Event** 的基本定义,并调用命名空间 **App\Events**。请注意,用户定义的或自定义事件是在此文件中创建的。

SomeEvent.php

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class SomeEvent extends Event{
   use SerializesModels;
   /**
      * Create a new event instance.
      *
      * @return void
   */
   
   public function __construct() {
      //
   }
   
   /**
      * Get the channels the event should be broadcast on.
      *
      * @return array
   */
   
   public function broadcastOn() {
      return [];
   }
}

观察到此文件使用序列化来广播 Web 应用中的事件,并且在此文件中也初始化了必要的参数。

例如,如果我们需要在构造函数中初始化 order 变量以注册事件,我们可以按以下方式进行:

public function __construct(Order $order) {
   $this->order = $order;
}

监听器

监听器处理正在注册的事件中提到的所有活动。Artisan 命令 **event:generate** 在 **app/listeners** 目录中创建所有 **监听器**。Listeners 文件夹包含一个文件 **EventListener.php**,其中包含处理监听器所需的所有方法。

EventListener.php

<?php

namespace App\Listeners;

use App\Events\SomeEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class EventListener{
   /**
      * Create the event listener.
      *
      * @return void
   */
   
   public function __construct() {
      //
   }

   /**
      * Handle the event.
      *
      * @param SomeEvent $event
      * @return void
   */
   
   public function handle(SomeEvent $event) {
      //
   }
}

如代码中所述,它包含用于管理各种事件的 **handle** 函数。我们可以创建各种独立的监听器来针对单个事件。

广告