文件:事件系统
建立事件: 使用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 - 設定郵件內容
php artisan make:mail WelcomeEmail
建立郵件類 WelcomeEmail
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));
}
}