LaravelのObserverでモデルの変更を検知する
はじめに
Laravel Novaで記事を管理していて、パフォーマンス対策のために、一定時間ファイルキャッシュを保持しているシステムがあります。
管理画面から記事を更新した際にキャッシュがすぐに削除されないため、いままでは手動でコマンドを実行していました。
管理画面から記事を更新した際にキャッシュがすぐに削除されないため、いままでは手動でコマンドを実行していました。
php artisan cache:clear
いちいち手動で大変なので、更新の際に自動でキャッシュクリアする仕組みを調べていたところ、LaravelのObserverという仕組みで実現できることがわかりました。
Laravel Novaのドキュメントでも紹介されています。
Modelに対する操作(CRUD)が発生した際に、Observerクラスに処理を通知します。
Laravel Novaのドキュメントでも紹介されています。
Modelに対する操作(CRUD)が発生した際に、Observerクラスに処理を通知します。
やってみる
artisanコマンドで、モデルに対するObserverクラスを作成します。今回は、Announcesテーブルに対して実行しました。
php artisan make:observer AnnouncesObserver --model=Announce上記のコマンドが成功すると、App\ObserversネームスペースにAnnouncesObserverクラスが生成されます。
みてみます(コメント省略)
<?php namespace App\Observers; use App\User; class UserObserver { public function created(Announce $announce) { } public function updated(Announce $announce) { } public function deleted(Announce $announce) { } }
とてもわかりやすいですね。では、Announseテーブルが更新されたらキャッシュをクリアするための手順を進めてみます。
Laravel標準のAppServiceProviderのbootメソッドに以下を追記します。
public function boot() { Announce::observe(AnnounceObserver::class); }
AnnounceObserverクラス
<php? // 略 public function updated(Announce $announce) { Cache::forget('cachekey'); }
これで、Announceテーブルが更新されたときに、キャッシュが自動的にパージされるようになりました。
他にも、DBに変更が入った場合にログをのこす、トリガーとして利用するなど、様々な用途で応用ができそうです。
他にも、DBに変更が入った場合にログをのこす、トリガーとして利用するなど、様々な用途で応用ができそうです。