zoukankan      html  css  js  c++  java
  • 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

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

           

  • 相关阅读:
    【Unity Shader 】CG语法
    编译boost到各个系统平台 mac,iOS,linux,android,wind
    c pvr转存pvr.ccz格式 (转 http://www.cnblogs.com/howeho/p/3586379.html)
    mac Nginx + FastCgi + Spawn-fcgi + c++
    得到指定占用宽度的字体 。(英文占用一个位,中文占用两个位,英文大写占用两个位)
    cocos2d 文件系统使用文件内存映射性能对比
    关于PUPBLD.SQL
    ora-01033:ORACLE initialization or shutdown in progress解决方法
    linux下如何查看命令的绝对路径
    【测试工具】http协议调试利器fiddler使用教程
  • 原文地址:https://www.cnblogs.com/tdalcn/p/14306574.html
Copyright © 2011-2022 走看看