美文网首页
laravel 事件系统

laravel 事件系统

作者: 顶尖少爷 | 来源:发表于2019-09-26 18:26 被阅读0次

    有一个明确的业务罗

    1. 创建订单 订单信息记录到数据库
    2. 发送邮件或者短信给用户订单生成到结果

    一般性作废demo

        public function addOrder(Request $request){
            //生成订单
            $order = $this->createOrder();
            //发送短信
        }
    
        protected function createOrder(){
            // 生成订单逻辑
            //
        }
        protected function sendEmail(){
            //发送邮件逻辑
        }
        protected function sendSms(){
            //发送短信逻辑
        }
    
    

    一般性的做法 同步执行 必须一个执行完成后再执行另外一个 如果想异步非堵塞就需要使用 任务队列。 而且代码的复用太低 如果有其他业务需求也需要发送 邮件和短信 就必须重新写一套

    事件系统

    laravel的事件功能实际上更倾向是一种管理手段,并不是没了它我们就做不到了,只是它能让我们做得更加好,更加优雅。

    laravel的事件是一种管理+实现的体现,它首先有一个总的目录,然后我们可以宏观的看到所有的事件,而不需要每次都要打开控制器的方法我们才能知道注册后会发生什么,这一点很重要,非常的方便,我就不按着laravel的顺序来讲,而是按着实际情况来建立这种关系。

    现在我们无非就是要在注册之后要做一系列的事情,首先得注册完之后调用一个事件,然后这个事件再做各种各样的事

    controller

        public function addOrder(Request $request){
            //生成订单
            $order = $this->createOrder();
    
            //订单事件
            event(new OrderEvent($order));
        }
    

    event

    namespace App\Events;
    
    use Illuminate\Broadcasting\Channel;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Broadcasting\PrivateChannel;
    use Illuminate\Broadcasting\PresenceChannel;
    use Illuminate\Foundation\Events\Dispatchable;
    use Illuminate\Broadcasting\InteractsWithSockets;
    use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
    
    class OrderEvent
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;
    
        public $order;
        /**
         * Create a new event instance.
         *
         * @return void
         */
        public function __construct($order)
        {
            //
            $this->order = $order;
        }
    
        /**
         * Get the channels the event should broadcast on.
         *
         * @return \Illuminate\Broadcasting\Channel|array
         */
        public function broadcastOn()
        {
            return new PrivateChannel('channel-name');
        }
    }
    

    listeners

    sendsms

    //如果implements ShouldQueue这个接口的话就会异步队列执行,如果去掉的话就是同步执行。很
    class SendSms implements ShouldQueue{
    //.
    //.
        /**
         * Handle the event.
         *
         * @param  object  $event
         * @return void
         */
        public function handle(OrderEvent $event)
        {
            //
            $order = $event->order;
            //执行发送短信的业务逻辑了
    
        }
    }
    
    

    sendemail

    //如果implements ShouldQueue这个接口的话就会异步队列执行,如果去掉的话就是同步执行。很
    class SendEmail implements ShouldQueue{
    //.
    //.
        /**
         * Handle the event.
         *
         * @param  object  $event
         * @return void
         */
        public function handle(OrderEvent $event)
        {
            //
            $order = $event->order;
            //执行发送邮件的业务逻辑了
    
        }
    }
    

    添加关系

    EventServiceProvider

        protected $listen = [
            //订单事件
            OrderEvent::class=>[
                //生成订单后
                SendSms::class,
                SendEmail::class
            ]
        ];
    

    相关文章

      网友评论

          本文标题:laravel 事件系统

          本文链接:https://www.haomeiwen.com/subject/imfsyctx.html