Laravel Event / EventSubscriber 用法

2022/06/10閱讀時間約 3 分鐘
比如訂單出貨的時候,觸發一個訂單出貨事件,發送出貨email通知給user。
需先註冊event與listener,在EventServiceProvider的$listen中定義:
產生event與listener:
下指令可以方便產生事件與監聽器檔案:
$ php artisan event:generate
產生的事件與監聽器如下:
接著修改一下code:
  • 觸發event的方式很簡單,如同OrderController中的寫法:
event(new OrderShipped($order));
把order物件傳進去,listener的handle method中可以拿到event中的order變數,後續就可以撰寫發送email通知的相關邏輯。

值得一提的是,一個event中可以有多個listener:
所以EventServiceProvider中可以這樣註冊,SendShipmentNotification2中還是一樣可以拿到event物件:

另外,如果是一個需要處理很久的job,可以結合Queue:
implements ShouldQueue即可,當觸發event的時候,就會把這個job加入queue中,當然server要先啟動queue listener,這邊不再贅述。
  • 如果要自訂connection與queue,則加上$connection與$queue來定義:

事件訂閱者

  • 還有一種用法是事件訂閱者,在EventServiceProvider 中使用 $subscribe來註冊訂閱者類別,比如OrderEventSubscriber/UserEventSubscriber等等。
  • 事件訂閱者可以幫助我們在一個類別中監聽多個事件。
  • OrderEventSubscriber中定義了跟訂單相關的事件,比如訂單出貨/訂單取消等等,當event觸發後就會執行對應的method中的程式,這樣寫就不用再多一個listener檔案。如果是UserEventSubscriber的話,裡面就可以定義user登入/登出的事件。
  • 假如要多一個訂單取消事件,EventServiceProvider的$listen就要再多一組訂單取消的event跟listener,使用OrderEventSubscriber好處是可以把訂單相關的事件都定義在這,除了管理上比較方便以外,EventServiceProvider也只需要在$subscribe中加入一行,相當簡潔,也不用為了訂單出貨/訂單取消各自新增listener。
本筆記參考:
  1. https://docs.laravel-dojo.com/laravel/5.5/events
  2. https://www.jianshu.com/p/50642ac4b8a4
為什麼會看到廣告
20會員
161內容數
留言0
查看全部
發表第一個留言支持創作者!