一、先讲观察者使用流程
1.先创建一个 AppObservers
文件夹,
2.然后创建想要操作的模型对应的 observer,比如说创建一个 AgentLogsObservers
3.然后到 AppServiceProvider
的 boot 方法当中进行注册,也可以是其他的 ServiceProvider,不固定。
// 为 AgentLogs 模型注册观察者
AgentLogs::observe(AgentLogsObservers::class);
注意:(别忘了引入 model,做完这些我们就可以各种操作了。)
观察者方法有很对比如:
retrieved, #获取到模型实例后触发
creating, #创建过程前 * 常用
created, #创建成功后 * 常用
updating, #更新过程前 * 常用
updated, #更新成功后 * 常用
saving, #代表这两个方法的集合creating,updating * 常用
saved, #代表这两个方法的集合created,updated * 常用
deleting, #删除过程前 * 常用
deleted, #删除过程后 * 常用
restoring, #恢复软删除记录前触发
restored, #恢复软删除记录后触发
4、接下来我们编写观察者方法
/**
* 监听修改事件.
*
* @param AppModelsMallAgentLogs $agentLogs
* @return void
*/
public function saved(AgentLogs $agentLogs){
ownLogs('observers.log','观察者-saved 收到执行通知 执行完毕!');
}
public function updated(AgentLogs $agentLogs){
ownLogs('observers.log','观察者-updated 收到执行通知 执行完毕!');
}
5、随便找个控制器去操作数据库,可以观察走到了个方法,以及先后顺序日志打印的顺序。
原理:
- 当模型已存在,非新建时,事件触发顺序如下:
saving
->updating
->updated
->saved
- 当模型不存在,即需要新增时,事件触发顺序如下:
saving
->creating
->created
->saved
这里我只测试 用save()方法去修改一条记录,如下图代码:
日志输出结果:
从下图可以发现:一个save()方法执行成功的话,会影响updated 和 saved,并且是先触发updated事件再触发saved事件,
刚好印证了上面的官方事件触发顺序:saving
-> updating
-> updated
-> saved
所以实际使用观察者的时候二选一即可,千万别两个事件重复交叉了