オブザーバーを使う目的
「データに手を加えたユーザーを記録したい」という要望があり、 データの作成者、編集者、削除者をDBに保存することになりました。
やること
DBの各テーブルにcreator,editor,deleterカラムを追加
マイグレーションファイル作成 (例)
php artisan make:migration add_creator_editor_deleter_to_all_table
Observer.phpを作成してCRUDイベントをキャッチ
namespace App\Observers;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class xxxObserver
{
public function created(Model $model)
{
// データ保存後に作成者を登録する処理
}
public function updated(Model $model)
{
// データ更新後に編集者を登録する処理
}
public function deleted(Model $model)
{
// データ削除後に削除者を登録する処理
}
}
Traitを作成してObserverが動くようにする
namespace App\Traits;
use App\Observers\xxxObserver;
trait xxxObservable
{
public static function bootxxxObservable()
{
self::observe(xxxObserver::class);
}
}
あとはModelで召喚するだけ
namespace App\Models;
use App\Traits\xxxObservable; //さっきつくったTrait
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use xxxObservable;
// 略
}
流れ自体は意外と簡単でした。 何より良いことは、ひとつオブザーバーを作成して任意のModelに呼び出すだけで 共通の処理ができる事です。便利なので機会があれば今後も使いたいですね。