Laravel - 事件處理

你好,未來的 Laravel 巫師們!今天,我們將一起探索 Laravel 中事件處理的神奇世界。別擔心你對編程還是新手——我會一步一步地引導你走過這個旅程,就像我過去幾年來為無數學生做的那樣。所以,拿起你喜歡的飲料,讓我們一起踏上這個令人興奮的冒險吧!

Laravel - Event Handling

Laravel 中的事件是什麼?

想像你在一個派對上(當然是編程派對啦!)。當有重要的事情發生——比如蛋糕到來時——每個人都會興奮起來。在 Laravel 中,事件就像你應用程序中的這些興奮時刻。它們是你應用程序關心的特殊事件。

例如,當用戶在你的網站上註冊時,那就是一個事件。當有人下訂單時,那又是另一個事件。事件幫助我們保持代碼的組織性,並讓應用程序的不同部分能夠對這些重要時刻做出反應。

為什麼使用事件?

  1. 解耦合:事件幫助分離應用程序的不同部分。這就像在工作中的不同團隊——每個團隊不需要知道其他團隊正在做的一切。

  2. 靈活性:你可以輕鬆地為事件添加新的反應,而不需要改變現有的代碼。

  3. 清晰性:事件讓你的代碼更容易理解。它清楚地表明了發生了什麼事情,以及何時發生。

創建你的第一個事件

讓我們一起創建我們的第一個事件。我們將創建一個在用戶註冊時發生的事件。我們這樣做:

php artisan make:event NewUserRegistered

這個命令在 app/Events 中創建了一個名為 NewUserRegistered.php 的新文件。讓我們看看裡面的內容:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewUserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $user;

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

public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}

別讓所有的這些代碼嚇到你!這就像一個食譜——我們會逐個食材走過:

  • 頂部的 use 語句就像我們可能需要的工具。
  • 我們的事件類 NewUserRegistered 是發生魔法的地方。
  • $user 屬性將保存新用戶的信息。
  • __construct 方法在我們創建此事件時被調用,並存儲用戶信息。

觸發(派發)事件

現在我們有了事件,讓我們使用它!當新用戶註冊時,我們將觸發這個事件。以下是在控制器中可能如何做到這一點:

use App\Events\NewUserRegistered;

public function register(Request $request)
{
// ... 用戶註冊邏輯 ...

$user = User::create($request->all());

event(new NewUserRegistered($user));

return redirect('/welcome');
}

在這裡,我們創建了一個新用戶後,使用 event() 函數觸發我們的事件。這就像放煙火慶祝新用戶一樣!

監聽事件

現在,讓我們創建一個監聽器來對我們的事件做出反應。想像派對上負責在蛋糕到來時發放派對帽子的人。

首先,讓我們創建一個監聽器:

php artisan make:listener SendWelcomeEmail --event=NewUserRegistered

這會在 app/Listeners 中創建一個名為 SendWelcomeEmail.php 的新文件。讓我們看看裡面的內容:

<?php

namespace App\Listeners;

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

class SendWelcomeEmail
{
public function handle(NewUserRegistered $event)
{
// 使用 $event->user 存取用戶
// 在這裡添加發送歡迎郵件的邏輯
}
}

handle 方法是我們放置事件發生時應該運行的代碼的地方。在這個例子中,我們會添加發送歡迎郵件的邏輯。

註冊事件監聽器

為了將我們的事件與監聽器相連接,我們需要註冊它們。打開 app/Providers/EventServiceProvider.php 並在 $listen 数组中添加以下內容:

protected $listen = [
NewUserRegistered::class => [
SendWelcomeEmail::class,
],
];

這告訴 Laravel,“當 NewUserRegistered 發生時,運行 SendWelcomeEmail!”

事件訂閱者

有時候,你可能希望一個類別處理多個事件。這就是事件訂閱者的用武之地。它們就像負責派對多個方面的派對策劃者。

以下是如何創建事件訂閱者:

php artisan make:listener UserEventSubscriber

然後,在 UserEventSubscriber 類中:

<?php

namespace App\Listeners;

class UserEventSubscriber
{
public function handleUserRegistered($event) {}

public function handleUserLoggedIn($event) {}

public function subscribe($events)
{
$events->listen(
'App\Events\NewUserRegistered',
'App\Listeners\UserEventSubscriber@handleUserRegistered'
);

$events->listen(
'App\Events\UserLoggedIn',
'App\Listeners\UserEventSubscriber@handleUserLoggedIn'
);
}
}

為了註冊這個訂閱者,將它添加到 EventServiceProvider 中的 $subscribe 屬性:

protected $subscribe = [
'App\Listeners\UserEventSubscriber',
];

排隊事件監聽器

如果你的事件監聽器正在做某種耗時操作(如發送電子郵件),你可能希望將其排隊,以免減慢應用程序的速度。這就像告訴某人,“嘿,你可以在不那麼忙的時候處理這個任務嗎?”

為了使監聽器可排隊,實現 ShouldQueue 接口:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
// ...
}

現在,Laravel 將自動將此監聽器排隊!

事件方法表

以下是我们在事件中使用的主要方法的便捷表格:

方法 描述
event() 派發事件
listen() 註冊事件監聽器
subscribe() 註冊事件訂閱者
dispatch() 另一種派發事件的方法
broadcast() (為實時應用程序)廣播事件

這就是它,我親愛的學生們!我們一起穿過了 Laravel 事件處理的土地。記住,熟練來自練習,所以不要害怕在你的項目中嘗試這些概念。誰知道呢?你可能會用你新學到的事件處理技巧,舉辦一個最棒的代碼派對!

歡樂編程,願你的事件總是被優雅和風格地處理!

Credits: Image by storyset