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** 函式。我們可以建立各種獨立的監聽器來針對單個事件。

廣告