思考 什么是模型监听? 为什么要使用模型监听
就相当于在执行模型操作的时候安装的一个小监控和一个小保安 当我们的监控到的时候让保安去执行一些操作 模型监听的出现是我们的代码变得高度解耦 还可以配合消息队列 可以解决在服务器高峰的时候暂缓一些任务 等高峰过去以后 帮我们执行一些操作 这里有个很好的例子就是我们的苹果手机支付 apple pay 他就是一个典型的例子 你在网上消费的钱他会晚一会进行扣款的操作
观察者监听模型事件
第一步 创建一个观察者
doc 命令创建一个观察者:
php artisan make:observer NoticeObserver -m Notice
默认生成的Noticeserver 会给你生成 created updated deleted restored(恢复) forceDeleted(强制删除)的空方法 根据他们的方法名你就不难看出他是什么时候执行监听的 如下图:
注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。
第二步:在我们的观察者类中写一个任务比如写日记
第三步:如果我们想要他在那个模型中执行 我们需要在这个模型中注册一下
因为他是继承的boot类 子类和父类重名的时候我们声明父类不然会被替换
例如我们刚才的任务是写在了created方法中 就说明这个任务是在添加完成以后执行
使用监听完成消息队列
消息队列流程图表
根据上图,首先创建消息管道,来存储任务 本次使用mysql表来当消息管道
创建容器数据表
php artisan queue:table 任务队列表
php artisan queue:failed-table 执行任务失败后,存储的表
php artisan migrate 执行迁移
注:在这里迁移的时候我们有时候报错原因是 我们配置文件database.php中的数据库格式是utf8mb4 我们修改为utf8 就可以执行迁移了 这里就是laravel的原因你直接更改数据库的字符集不管用
创建任务
php artisan make:job xxx
创建完成的文件
在我们刚才的观察者中添加一下这个任务
当我们执行完成添加操作以后我们就可以在我们的表中看到我们待执行的任务了
可是我们做完这一系列操作以后你会发现你并没有执行任务 这是因为我们没有人去消费他参考上图 他现在就相当于消息队列 一个一个待执行的任务在管道中排好队等你去执行 上面这个表就是你管道中现在的内容
消费管道中的任务
php artisan queue:work
当这串doc命令执行以后你会看到
这里就是已经开始消费了 完成以后你管道中的数据就会消失