在 Laravel 的世界裡,事件 (Events) 和監聽器 (Listener) 就像是程式中的小助手,幫助我們減少不同部分之間的依賴。
Laravel's events provide a simple observer pattern implementation, allowing you
to subscribe and listen for various events that occur within your application. Event classes are typically stored in theapp/Events
directory, while their listeners are stored inapp/Listeners
. Don't worry if you don't see these directories in your application as they will be created for you as you generate events and listeners using Artisan console commands.Events serve as a great way to decouple various aspects of your application, since a single event can have multiple listeners that do not depend on each other. For example, you may wish to send a Slack notification to your user each time an order has shipped. Instead of coupling your order processing code to your Slack notification code, you can raise an
App\Events\OrderShipped
event which a listener can receive and use to dispatch a Slack notification.
Laravel 的 Events 讓我們可以輕鬆監聽應用裡發生的事件。Events 類別放在 app/Events,listeners 放在 app/Listeners,這些資料夾會在生成時自動創建。
使用事件的好處是讓應用的不同部分獨立運作。比如,當訂單發貨時,可以觸發一個 OrderShipped
event,然後用一個 listener 來發送 Slack 通知,這樣代碼更乾淨,維護起來也更方便。
我們來看看使用 Event 和不使用 Event 有什麼不同吧!
如果我們不使用 Events,註冊過程的所有邏輯通常會全部塞進控制器裡,維護起來會麻煩很多!
來看看這段代碼:
public function register(Request $request)
{
// 驗證註冊資料
$validatedData = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
// 創建用戶
$user = User::create([
'name' => $validatedData['name'],
'email' => $validatedData['email'],
'password' => Hash::make($validatedData['password']),
]);
// 發送歡迎郵件
Mail::to($user->email)->send(new WelcomeEmail($user));
return redirect()->route('home')->with('success', '註冊成功!');
}
但如果我們讓 Events 來幫忙,就可以把一些邏輯分開,讓代碼變得更清晰,重用起來也方便多了
創建 Events:使用 make:event
創建一個 UserRegistered
Events
php artisan make:event UserRegistered
// 這樣我們就能把用戶信息傳進這個 Events
class UserRegistered
{
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
創建 Listener:使用 make:listener
創建一個 SendWelcomeEmail
Listener。
php artisan make:listener SendWelcomeEmail
// 在這裡,我們專心處理發送郵件的邏輯。
class SendWelcomeEmail
{
public function handle(UserRegistered $event)
{
Mail::to($event->user->email)->send(new WelcomeEmail($event->user));
}
}
註冊 Events 和 listener:別忘了在 EventServiceProvider
中把它們註冊上!
protected $listen = [
UserRegistered::class => [
SendWelcomeEmail::class,
],
];
在控制器中觸發 Events:
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$user = User::create([
'name' => $validatedData['name'],
'email' => $validatedData['email'],
'password' => Hash::make($validatedData['password']),
]);
// 觸發事件
event(new UserRegistered($user));
return redirect()->route('home')->with('success', '註冊成功!');
}
比較項目 | 不使用 Events | 使用 Events |
---|---|---|
可讀性與維護性 | 所有邏輯都在控制器裡,代碼看起來一團亂。 | 邏輯分得清清楚楚,維護起來輕鬆多了! |
可重用性 | 發送郵件的邏輯每次都得重複,真麻煩。 | 監聽器可以隨處使用,靈活得很! |
減少依賴 | 邏輯緊緊相連,改動時可能影響其他部分。 | 系統各部分之間的依賴減少,未來擴展輕而易舉! |
結構 | 所有邏輯集中在控制器,代碼臃腫,難以維護。 | 代碼模組化,邏輯分離,易於擴展。 |
使用 Laravel 的 Events 和 Listener 可以讓代碼更易讀、更好維護,還能幫助我們把不同功能模組化。但要不要用 Events,其實還是要看個人的具體需求。如果應用邏輯簡單,可能不需要這麼多的架構;但如果系統比較複雜,使用 Events 來解耦功能會讓未來的擴展和維護變得簡單多了。開發者可以根據實際情況,靈活決定是否要引入 Events 機制。
參考資料:
踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
逆位權杖皇后:「停下來,望向遠方」今天寫鐵人賽的時候,腦袋真的漲漲的,就像權杖皇后牌面倒過來了,迷失方向。或許我需要暫停一下,不再執著於眼前的問題,而是從更高的角度來看待它。放鬆焦慮,靜心觀察,也許會發現新的思考方式。即使面對眼前的挑戰感到茫然,我仍然要保持內心的熱情與動力。就像權杖皇后手中的權杖一樣,即使倒置,它依然指向前方,重要的是要保持對未來的期待和信心。希望在接下來的日子裡,能夠找到新的靈感,重新回到正軌。
如果日子過累了、走乏了,一定要記得,你的身體裡有著能夠克服這些負面情緒的力量,請你相信自己!
如果現在感到不安,就代表妳有在認真過生活,不必太過擔心
—《為什麼,你的人生填滿別人的待辦清單?》