laravel觀察者模式使用及注意事項

一、先講觀察者使用流程

          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

所以實際使用觀察者的時候二選一即可,千萬別兩個事件重複交叉了

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章