iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 19

第 19 天:事件與監聽器

  • 分享至 

  • xImage
  •  

文件:事件系统
建立事件: 使用 php artisan make:event 指令建立事件類,定義需要傳遞的資料。
觸發事件: 使用 event() 函數觸發事件。
建立監聽器: 使用 php artisan make:listener 指令建立監聽器類,處理事件邏輯。
註冊監聽器:EventServiceProvider 中註冊事件和監聽器。

創建和觸發事件


事件允許在應用程式中發布和訂閱訊息,也可以使用事件來解耦應用的各個部分,使其更易於維護和擴展。

建立事件
使用指令 php artisan make:event UserRegistered 建立事件類,在 app/Events/UserRegistered.php 編輯該文件以定義事件的數據

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Models\User;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public $user;

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

觸發事件
使用 event() 函數在用戶註冊時觸發事件

use App\Events\UserRegistered;

public function register(Request $request)
{
    // 使用者註冊邏輯
    $user = User::create($request->all());

    // 觸發事件
    event(new UserRegistered($user));

    return redirect()->route('home');
}

編寫監聽器處理事件


監聽器的職責是處理事件並執行特定的操作,所以可以建立監聽器來執行任務,例如:發送通知或記錄日誌。

建立監聽器
使用指令 php artisan make:listener SendWelcomeEmail --event=UserRegistered 建立監聽類,在 app/Listeners 目錄下產生一個監聽器類別 app/Listeners/SendWelcomeEmail.php,編輯該文件以處理事件:

namespace App\Listeners;

use App\Events\UserRegistered;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail
{
    public function __construct()
    {
        //
    }

    public function handle(UserRegistered $event)
    {
        // 發送歡迎郵件
        Mail::to($event->user->email)->send(new \App\Mail\WelcomeEmail($event->user));
    }
}

註冊監聽器
app/Providers/EventServiceProvider.php 中註冊事件和監聽器:

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use App\Events\UserRegistered;
use App\Listeners\SendWelcomeEmail;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        UserRegistered::class => [
            SendWelcomeEmail::class,
        ],
    ];

    public function boot()
    {
        parent::boot();
    }
}

實際應用場景(如用戶註冊後發送通知)


文件:发送邮件
建立郵件類: 使用 php artisan make:mail 指令建立郵件類,並在其中定義郵件內容。
定義郵件內容: 在郵件類別中定義郵件的檢視和傳遞的資料。
建立視圖:resources/views/emails 目錄下建立視圖,用於郵件的 HTML 內容。
使用郵件類別: 在監聽器中呼叫郵件類別來傳送郵件。

一個常見的應用程式場景是用戶註冊後發送歡迎郵件,這時候就可以使用事件和監聽器來解耦使用者註冊和發送郵件。

step 1 - 建立事件
建立事件:UserRegistered(如前所述 創建和觸發事件 )

step 2 - 建立監聽器
建立監聽器:SendWelcomeEmail(如前所述 編寫監聽器處理事件 )

step 3 - 設定郵件內容

  1. 下指令 php artisan make:mail WelcomeEmail 建立郵件類 WelcomeEmail
  2. app/Mail/WelcomeEmail.php 檔案中,設定郵件的內容、視圖和附加的資料
    namespace App\Mail;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;
    use App\Models\User;
    
    class WelcomeEmail extends Mailable
    {
        use Queueable, SerializesModels;
    
        public $user;
    
        // 建構函數接受 User 實例作為參數
        public function __construct(User $user)
        {
            $this->user = $user;
        }
    
        // 郵件內容建構方法
        public function build()
        {
            return $this->view('emails.welcome')        // 視圖檔案路徑
                        ->with('user', $this->user);    // 傳遞給視圖的數據
        }
    }
    

step 4 - 建立郵件視圖
resources/views/emails 目錄下建立視圖 welcome.blade.php,主要是郵件的 HTML 內容

<!DOCTYPE html>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
    <h1>Welcome, {{ $user->name }}!</h1>
    <p>Thank you for registering with us. We are excited to have you on board.</p>
</body>
</html>

step 5 - 在監聽器中使用郵件類
在事件監聽器 SendWelcomeEmail 中,呼叫 WelcomeEmail 類別來傳送郵件:

// app/Listeners/SendWelcomeEmail.php
namespace App\Listeners;

use App\Events\UserRegistered;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeEmail;

class SendWelcomeEmail
{
    public function __construct()
    {
        //
    }

    public function handle(UserRegistered $event)
    {
        // 發送歡迎郵件
        Mail::to($event->user->email)->send(new WelcomeEmail($event->user));
    }
}

上一篇
第 18 天:驗證與自定義規則
下一篇
第 20 天:服務提供者
系列文
後端小白自學 Laravel21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言