它山之石可以攻玉

键盘上的生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

laravel观察者模式使用及注意事项

Posted on 2021-01-21 10:14  陈达辉  阅读(434)  评论(0编辑  收藏  举报

一、先讲观察者使用流程

          1.先创建一个 App\Observers 文件夹,

          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  \App\Models\Mall\AgentLogs  $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

所以实际使用观察者的时候二选一即可,千万别两个事件重复交叉了