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


    一、先讲观察者使用流程

              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

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

           

  • 相关阅读:
    Apollo与ROS
    QT windeployqt
    自定义QGraphicsItem
    ROS与C++
    aptitude与apt-get
    解决tcp粘包问题
    网络中两台主机通信
    I/O多路复用之select、poll、epoll
    Nginx命令行控制
    C++11
  • 原文地址:https://www.cnblogs.com/tdalcn/p/14306574.html
Copyright © 2020-2023  润新知