iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Software Development

Laravel 隨筆學習札記系列 第 25

Day25 - 善用 Laravel Events 提升代碼重用性

  • 分享至 

  • xImage
  •  

在 Laravel 的世界裡,事件 (Events) 和監聽器 (Listener) 就像是程式中的小助手,幫助我們減少不同部分之間的依賴。

先來看看什麼是 Events

官方網站說

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 the app/Events directory, while their listeners are stored in app/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 的註冊系統

如果我們不使用 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 來幫忙,就可以把一些邏輯分開,讓代碼變得更清晰,重用起來也方便多了

  • 創建 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 機制。


參考資料:

  1. Laravel 中的 Event 和事件的概念
  2. A guide to Laravel events and listeners
  3. Laravel官方網站:Events

踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!

逆位權杖皇后:「停下來,望向遠方」今天寫鐵人賽的時候,腦袋真的漲漲的,就像權杖皇后牌面倒過來了,迷失方向。或許我需要暫停一下,不再執著於眼前的問題,而是從更高的角度來看待它。放鬆焦慮,靜心觀察,也許會發現新的思考方式。即使面對眼前的挑戰感到茫然,我仍然要保持內心的熱情與動力。就像權杖皇后手中的權杖一樣,即使倒置,它依然指向前方,重要的是要保持對未來的期待和信心。希望在接下來的日子裡,能夠找到新的靈感,重新回到正軌。

如果日子過累了、走乏了,一定要記得,你的身體裡有著能夠克服這些負面情緒的力量,請你相信自己!

如果現在感到不安,就代表妳有在認真過生活,不必太過擔心

—《為什麼,你的人生填滿別人的待辦清單?》


上一篇
Day24 - 掌握 Laravel 11 Artisan:開發者的最佳夥伴!
下一篇
Day26 - 簡化認證:用 Laravel Authentication 建立使用者登入
系列文
Laravel 隨筆學習札記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言