一、先講觀察者使用流程
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
所以實際使用觀察者的時候二選一即可,千萬別兩個事件重複交叉了