モデルイベントとは
Eloquentモデルはライフサイクルの各タイミングで自動的にイベントを発火します。これらのイベントにフックすることで、モデルの保存・削除などの前後に処理を差し込めます。 Eloquentが発火するイベントは以下のとおりです。-ing で終わるイベントは変更がDBに永続化される前に、-ed で終わるイベントは後に発火します。
クロージャを使ったイベントリスナー
イベントをシンプルに扱いたい場合は、モデルのbooted メソッド内でクロージャを登録できます。
queueable ヘルパーを使います。
$dispatchesEvents プロパティ
Laravelのイベントシステムと連携したい場合は、$dispatchesEvents プロパティでモデルイベントを独自のイベントクラスにマッピングします。
Observerクラスの作成
1つのモデルに対して複数のイベントを処理する場合、クロージャを並べるよりもObserverクラスにまとめるほうがすっきりします。1
Artisanコマンドでクラスを生成する
make:observer コマンドで雛形を生成します。--model オプションでモデルを指定すると、対応するメソッドが自動で追加されます。app/Observers/UserObserver.php が生成されます。2
各イベントのメソッドを実装する
メソッド名がイベント名に対応します。引数にはモデルのインスタンスが渡されます。
3
ObserverをModelに登録する
登録方法は2つあります。Laravel 13では 複数のObserverを登録する場合はアトリビュートを繰り返すか、配列で渡します。方法2:
#[ObservedBy] アトリビュートを使う方法が推奨されます。方法1: #[ObservedBy] アトリビュート(推奨)モデルクラスにアトリビュートを付与するだけで登録が完了します。AppServiceProvider の変更が不要です。AppServiceProvider で登録するAppServiceProvider の boot メソッドで observe を呼び出します。#[ObservedBy] アトリビュートは Illuminate\Database\Eloquent\Attributes 名前空間にあります。PHP 8.0以降のネイティブ構文で、Laravel 13で積極的に採用されています。データベーストランザクション内でのObserver
モデルがトランザクション内で作成・更新される場合、トランザクションのコミット後にObserverを実行したいことがあります。ShouldHandleEventsAfterCommit インターフェースを実装するとその挙動になります。
イベントを一時的に無効化する
withoutEvents で特定の処理だけイベントを止める
User::withoutEvents() に渡したクロージャ内では、一切のモデルイベントが発火しません。
saveQuietly で保存時のイベントを止める
イベントを発火させずにモデルを保存したいときは saveQuietly を使います。
実践的なユースケース
キャッシュの自動クリア
モデルが更新・削除されたときに関連するキャッシュを自動でクリアします。監査ログの記録
モデルの変更履歴を自動で記録します。getDirty() で変更前後の値を取得できます。
関連モデルの自動更新
注文が完了したときに在庫数を自動で更新する例です。次のステップ
上級: PHPアトリビュート
#[ObservedBy] を含む、Laravel 13のPHPアトリビュートをまとめて学びます。