Skip to main content

モデルイベントとは

Eloquentモデルはライフサイクルの各タイミングで自動的にイベントを発火します。これらのイベントにフックすることで、モデルの保存・削除などの前後に処理を差し込めます。 Eloquentが発火するイベントは以下のとおりです。 -ing で終わるイベントは変更がDBに永続化されるに、-ed で終わるイベントはに発火します。
マスアップデートやマスデリート(User::where(...)->update(...) など)では、savingsavedupdatingupdateddeletingdeleted イベントは発火しません。モデルが実際には取得されないためです。

クロージャを使ったイベントリスナー

イベントをシンプルに扱いたい場合は、モデルの booted メソッド内でクロージャを登録できます。
処理をキューで非同期実行したい場合は queueable ヘルパーを使います。

$dispatchesEvents プロパティ

Laravelのイベントシステムと連携したい場合は、$dispatchesEvents プロパティでモデルイベントを独自のイベントクラスにマッピングします。
マッピングしたイベントクラスには、コンストラクタでモデルのインスタンスを受け取ります。

Observerクラスの作成

1つのモデルに対して複数のイベントを処理する場合、クロージャを並べるよりもObserverクラスにまとめるほうがすっきりします。
1

Artisanコマンドでクラスを生成する

make:observer コマンドで雛形を生成します。--model オプションでモデルを指定すると、対応するメソッドが自動で追加されます。
app/Observers/UserObserver.php が生成されます。
2

各イベントのメソッドを実装する

メソッド名がイベント名に対応します。引数にはモデルのインスタンスが渡されます。
3

ObserverをModelに登録する

登録方法は2つあります。Laravel 13では #[ObservedBy] アトリビュートを使う方法が推奨されます。方法1: #[ObservedBy] アトリビュート(推奨)モデルクラスにアトリビュートを付与するだけで登録が完了します。AppServiceProvider の変更が不要です。
複数のObserverを登録する場合はアトリビュートを繰り返すか、配列で渡します。
方法2: AppServiceProvider で登録するAppServiceProviderboot メソッドで observe を呼び出します。
#[ObservedBy] アトリビュートは Illuminate\Database\Eloquent\Attributes 名前空間にあります。PHP 8.0以降のネイティブ構文で、Laravel 13で積極的に採用されています。

データベーストランザクション内でのObserver

モデルがトランザクション内で作成・更新される場合、トランザクションのコミット後にObserverを実行したいことがあります。ShouldHandleEventsAfterCommit インターフェースを実装するとその挙動になります。
トランザクション外で実行された場合は、通常どおり即時実行されます。

イベントを一時的に無効化する

withoutEvents で特定の処理だけイベントを止める

User::withoutEvents() に渡したクロージャ内では、一切のモデルイベントが発火しません。

saveQuietly で保存時のイベントを止める

イベントを発火させずにモデルを保存したいときは saveQuietly を使います。
同様のメソッドが削除・復元・レプリケートにも用意されています。

実践的なユースケース

キャッシュの自動クリア

モデルが更新・削除されたときに関連するキャッシュを自動でクリアします。

監査ログの記録

モデルの変更履歴を自動で記録します。getDirty() で変更前後の値を取得できます。
updating イベントはDBへの保存に発火するため、getDirty() で変更予定の値を取得できます。updated イベント後に呼ぶと getDirty() は空になります。

関連モデルの自動更新

注文が完了したときに在庫数を自動で更新する例です。

次のステップ

上級: PHPアトリビュート

#[ObservedBy] を含む、Laravel 13のPHPアトリビュートをまとめて学びます。
最終更新日 2026年3月28日