Laravel 事件(Events)和監聽器(Listeners)

說明

事件(Events)和監聽器(Listeners)是用於實現應用程式內部事件驅動的重要概念。

使用事件驅動架構具有以下幾個優勢:

  1. 解耦性:可將應用程式不同部分解耦,便於維護與擴展。
  2. 可讀性:將事件處理邏輯封裝於監聽器中,使業務邏輯更清晰。
  3. 重複使用:相同事件與監聽器可於多處使用,減少重複程式碼。
  4. 監視與記錄:便於加入監控與日誌功能,無需修改核心邏輯。
  5. 可測試性:可透過模擬事件與監聽器,便於單元測試。

設計流程

1. 建立事件

事件類別通常存放於 app/Events 目錄。

php artisan make:event EventName

2. 編輯事件

定義事件的屬性與建構函式:

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class EventName
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $data;

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

3. 建立監聽器

監聽器類別通常存放於 app/Listeners 目錄。

php artisan make:listener ListenerName --event=EventName

4. 編輯監聽器

定義事件的處理邏輯:

namespace App\Listeners;

use App\Events\EventName;

class ListenerName
{
    public function handle(EventName $event)
    {
        // 處理事件邏輯,存取 $event->data
    }
}

5. 註冊事件與監聽器

app/Providers/EventServiceProvider.php 註冊:

protected $listen = [
    EventName::class => [
        ListenerName::class,
    ],
];

6. 觸發事件

在應用程式中某處觸發事件:

event(new EventName($data));