鍍金池/ 問答/PHP/ laravel 事件監(jiān)聽中的code如何編寫更合理

laravel 事件監(jiān)聽中的code如何編寫更合理

初次使用laravel的事件監(jiān)聽功能,想要實(shí)現(xiàn)如下業(yè)務(wù)邏輯,請(qǐng)教如何編寫合理的代碼!

//controller codes
class OrderController extends Controller
{
    function create()
    {
        //do something ...
        
        
        event(new OrderWasCreated($order_id));
    }
}

//api codes
class ApiController extends Controller
{
    function sendEmail()
    {
        //do something ...
    }
}

//Listeners codes
class SendEmail
{
    public function handle(OrderWasCreated $event)
    {
        //send email ...
    }
}

有如上三段代碼,現(xiàn)在就是想實(shí)現(xiàn)當(dāng)訂單創(chuàng)建時(shí)在監(jiān)聽器中發(fā)送郵件的業(yè)務(wù)邏輯,不過我不太清楚應(yīng)該將處理郵件發(fā)送的代碼寫在哪里比較合適?于是我創(chuàng)建了一個(gè)api做處理,應(yīng)該如何與監(jiān)聽器關(guān)聯(lián)呢???

回答
編輯回答
別傷我

一般在Listeners 里面就可以完成發(fā)送郵件了,你想用api的話,可以把a(bǔ)pi作為全局的helper來用,或者use ../Api, 然后在SendEmail handle方法new Api()調(diào)用

2017年10月20日 23:41
編輯回答
朕略萌

在 listener中可以直接發(fā)送的。把 event對(duì)象的數(shù)據(jù)帶夠,丟到隊(duì)列里后臺(tái)執(zhí)行。

2018年9月11日 19:43
編輯回答
旖襯

如果是我的話,我會(huì)這么做

首先先創(chuàng)建一個(gè)OrderCreated的事件

再創(chuàng)建一個(gè)OrderCreatedListener,監(jiān)聽OrderCreated事件

再創(chuàng)建一個(gè)OrderCreatedNotification,用于處理訂單創(chuàng)建的通知

最后創(chuàng)建一個(gè)OrderCreatedMail,用于生成通知郵件

調(diào)用方式是控制器觸發(fā)OrderCreated事件,OrderCreatedListener監(jiān)聽到事件,觸發(fā)OrderCreatedNotification,OrderCreatedNotification再調(diào)用OrderCreateMail生成通知郵件,最后發(fā)送

這么做的好處

  1. 通知從監(jiān)聽器解耦。監(jiān)聽器不僅僅只做通知的功能,還可以做例如訂單超時(shí)關(guān)閉等其他功能(當(dāng)然也可以額外再創(chuàng)建一個(gè)Listener處理)。
  2. 通知非常易于擴(kuò)展。后期可以非常方便的擴(kuò)展通知頻道,比如App通知、短信通知等。
  3. Mail與通知解耦。通知里面可以根據(jù)用戶類型,調(diào)用不同的通知郵件,例如針對(duì)VIP用戶和普通用戶,調(diào)用不同的Mail類模板,生成不同的Mail

題主可以根據(jù)自己的業(yè)務(wù)復(fù)雜程度進(jìn)行相應(yīng)的增減步驟

2018年7月26日 22:20
編輯回答
萢萢糖

我覺得 ApiController 多余了
SendEmail listener 本身就是為了發(fā)送訂單生成郵件的 基本上不存在需要復(fù)用的.
最多是在SendEmail類中封裝一個(gè)私有方法來處理發(fā)送就好了

2017年4月30日 14:47