laravel 事件监听中的code如何编写更合理

初次使用laravel的事件监听功能,想要实现如下业务逻辑,请教如何编写合理的代码!

//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 ...
    }
}

有如上三段代码,现在就是想实现当订单创建时在监听器中发送邮件的业务逻辑,不过我不太清楚应该将处理邮件发送的代码写在哪里比较合适?于是我创建了一个api做处理,应该如何与监听器关联呢???

阅读 3.3k
4 个回答

如果是我的话,我会这么做

首先先创建一个OrderCreated的事件

再创建一个OrderCreatedListener,监听OrderCreated事件

再创建一个OrderCreatedNotification,用于处理订单创建的通知

最后创建一个OrderCreatedMail,用于生成通知邮件

调用方式是控制器触发OrderCreated事件,OrderCreatedListener监听到事件,触发OrderCreatedNotificationOrderCreatedNotification再调用OrderCreateMail生成通知邮件,最后发送

这么做的好处

  1. 通知从监听器解耦。监听器不仅仅只做通知的功能,还可以做例如订单超时关闭等其他功能(当然也可以额外再创建一个Listener处理)。
  2. 通知非常易于扩展。后期可以非常方便的扩展通知频道,比如App通知、短信通知等。
  3. Mail与通知解耦。通知里面可以根据用户类型,调用不同的通知邮件,例如针对VIP用户和普通用户,调用不同的Mail类模板,生成不同的Mail

题主可以根据自己的业务复杂程度进行相应的增减步骤

一般在Listeners 里面就可以完成发送邮件了,你想用api的话,可以把api作为全局的helper来用,或者use ../Api, 然后在SendEmail handle方法new Api()调用

我觉得 ApiController 多余了
SendEmail listener 本身就是为了发送订单生成邮件的 基本上不存在需要复用的.
最多是在SendEmail类中封装一个私有方法来处理发送就好了

在 listener中可以直接发送的。把 event对象的数据带够,丢到队列里后台执行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题