laravel8 模型监听之观察者监听事件 附带消息队列实现

190 阅读3分钟

思考 什么是模型监听? 为什么要使用模型监听 就相当于在执行模型操作的时候安装的一个小监控和一个小保安 当我们的监控到的时候让保安去执行一些操作 模型监听的出现是我们的代码变得高度解耦 还可以配合消息队列 可以解决在服务器高峰的时候暂缓一些任务 等高峰过去以后 帮我们执行一些操作 这里有个很好的例子就是我们的苹果手机支付 apple pay 他就是一个典型的例子 你在网上消费的钱他会晚一会进行扣款的操作

观察者监听模型事件

第一步 创建一个观察者

doc 命令创建一个观察者:

php article make:observer OrderObserver -m Order

默认生成的Noticeserver 会给你生成 created updated deleted restored(恢复) forceDeleted(强制删除)的空方法 根据他们的方法名你就不难看出他是什么时候执行监听的 如下图:

image.png

注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。

第二步:在我们的观察者类中写一个任务比如写日记

image.png

第三步:如果我们想要他在那个模型中执行 我们需要在这个模型中注册一下

image.png

因为他是继承的boot类 子类和父类重名的时候我们声明父类不然会被替换

例如我们刚才的任务是写在了created方法中 就说明这个任务是在添加完成以后执行

image.png

使用监听完成消息队列 消息队列流程图表

image.png

根据上图,首先创建消息管道,来存储任务 本次使用mysql表来当消息管道

创建容器数据表

php artisan queue:table 任务队列表

php artisan queue:failed-table 执行任务失败后,存储的表

php artisan migrate 执行迁移

注:在这里迁移的时候我们有时候报错原因是 我们配置文件database.php中的数据库格式是utf8mb4 我们修改为utf8 就可以执行迁移了 这里就是laravel的原因你直接更改数据库的字符集不管用

image.png

创建任务

php artisan make:job xxx 创建完成的文件

image.png

在我们刚才的观察者中添加一下这个任务

image.png

当我们执行完成添加操作以后我们就可以在我们的表中看到我们待执行的任务了

image.png

可是我们做完这一系列操作以后你会发现你并没有执行任务 这是因为我们没有人去消费他参考上图 他现在就相当于消息队列 一个一个待执行的任务在管道中排好队等你去执行 上面这个表就是你管道中现在的内容

消费管道中的任务

php artisan queue:work 当这串doc命令执行以后你会看到

image.png