對於單個模型的模型事件,我們可以採用observer或者dispatchEvents的形式,如果要求在所有模型儲存後,做一個相同的操作,那我們要不就需要在分散的observer裡寫重複的程式碼,要不就新建很多events,dispatch出去。有沒有一個簡便的方法呢?研究了下原始碼和論壇文章後,目前採用的下面這種方法,有什麼不足或者錯誤,歡迎大家批評指正。
1. 新建一個訂閱者
<?php
namespace App\Listeners;
use Illuminate\Support\Facades\Log;
class ModelEventSubscriber
{
/**
* 處理所有模型的saved事件
*/
public function onSaved($event, $data)
{
Log::info($event, $data);
}
/**
* 為訂閱者註冊監聽器
*
* @param \Illuminate\Events\Dispatcher $events
*/
public function subscribe($events)
{
$events->listen(
[
'eloquent.saved: *',
],
'App\Listeners\ModelEventSubscriber@onSaved'
);
}
}
2. 在App/Provider/EventServiceProvider.php里加上剛建立的訂閱者
/**
* 需要註冊的訂閱者類。
*
* @var array
*/
protected $subscribe = [
'App\Listeners\ModelEventSubscriber'
];
3.執行測試,檢視日誌發現可以正常執行
如果要監聽其他事件,在ModelEventSubscriber
的$subscribe
裡直接加就行,比如eloquent.created: *
就是匹配所有模型的created事件,eloquent.created: App\Models\*
就是匹配App\Models目錄裡面所有模型的created事件。
本作品採用《CC 協議》,轉載必須註明作者和本文連結