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

Laravel框架
384
0
0
2022-09-12

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

使用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