laravel8 模型监听事件以及消息队列

为了解决,添加数据成功后,代码不在控制器中编写,让代码分层

使用artisan命令来添加模型观察事件

//此命令是laravel5.5之后才有的,之前想要有此功能,手动创建目录和文件
php artisan make:observer NoticeObserver -m Notice

安装之后位置 app\Observers\NoticeObserver.php

需要在模型中注册一下

 /**
     * 使用laravel提供模型初始化方法  方法中最早执行
     */
    protected static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub
        //注册自定义观察类
        self::observe(NoticeObserver::class);
    }

在事件观察类中添加如下的事件,名写上日志

 /**
     * 调用注册模型create添加时执行
     * Handle the Notice "created" event.
     *
     * @param  \App\Models\Notice  $notice
     * @return void
     */
    public function created(Notice $notice)
    {
        sleep(5);
        Log::info('======添加成功====');

    }

此时表单提交数据后,就会在触发模型事件,就会写入日志

消息队列

laravel8 模型监听事件以及消息队列

根据上图,首先创建消息管道,来存储任务

本次使用mysql表来当消息管道

创建容器数据表

php artisan queue:table   任务队列表
php artisan queue:failed-table  执行任务失败后,存储的表
php artisan migrate  执行迁移

在.env文件中设置框架异步

在config目录中查看laravel默认支持的消息队列驱config\queue.php

'default' => env('QUEUE_CONNECTION', 'sync'),

//改成

'default' => env('QUEUE_CONNECTION', 'database'),

//不修改的话,可以在 .env 里修改

QUEUE_CONNECTION=database
创建任务
php artisan make:job xxx

安装之后位置 app\Jobs\NoticeJob.php

在模型事件中添加一个任务,生产一个任务


namespace App\Observers;

class NoticeObserver
{
    /**
     * 调用注册模型create添加时执行
     * Handle the Notice "created" event.
     *
     * @param  \App\Models\Notice  $notice
     * @return void
     */
    public function created(Notice $notice)
    {

        //添加生产任务
        dispatch(new NoticeJob());
    }

在任务文件中添加要干的事情


namespace App\Jobs;

/**
     * 添加要干的事
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        sleep(5);
        Log::info('======添加成功====');
    }

此时如果添加预约,添加成功后,就会在消息容器中有一个任务待执行

消费者

因为使用了laravel自带消息队列,所以消费者不需要写任务代码

//使用php artisan来消费它
php artisan queue:work

总结

了解ORM模型事件定义

为何要使用?
    可以让代码业务分离,方便日后代码升级维护。
如何使用
    创建一个观察类
        php artisan make:observer  Xxxobserver -m  模型
        常用事件方法
        creating/created
        updating/updated
    给指定的模型绑定监听
        public static function boot(){
            parent::boot();
            self:observe(观察类::class);
        }
    模型事件就绑定成功

能够添加任务到队列中

为何用队列呢?
    为了提高并发,减少服务器压力,做到任务的异步
    生产者  --->  管道  --->   消费者
    使用laravel提供消息队列
    管道:数据库
    迁移文件
    修改.env配置文件,让队列变为异步
    创建一个任务  php artisan make:job XxxJob
        在任务类中  handle  写任务代码,要干的活
    在需要另人去干活的地方去生成一下  dispatch(new XxxJob());

    另起一个进程,来进行消费
        php artisan queue:work
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!