ハマログ

株式会社イーツー・インフォの社員ブログ

LaravelのObserverでモデルの変更を検知する

はじめに

Laravel Novaで記事を管理していて、パフォーマンス対策のために、一定時間ファイルキャッシュを保持しているシステムがあります。

管理画面から記事を更新した際にキャッシュがすぐに削除されないため、いままでは手動でコマンドを実行していました。
php artisan cache:clear
いちいち手動で大変なので、更新の際に自動でキャッシュクリアする仕組みを調べていたところ、Laravelの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に変更が入った場合にログをのこす、トリガーとして利用するなど、様々な用途で応用ができそうです。
crudDELETEEloquentforceDeletehookLaravelmodelObserverrestoresaveパターン

  kaneko tomo   2019年11月30日


関連記事

コーポレートサイトリニューアル

こんにちは、かねこです。 つい先週、かれこれ2〜3年使っていたコーポレートサイト…

Postfixから送信するメールにDKIMを設定する

はじめに LINUXサーバで可動しているPostfixから送信しているメールが迷…

Vagrantで静的ファイルの更新が反映されない時の覚書

Vagrantで開発環境を構築した初期のプロジェクトでは、CSSやJavaScr…


← 前の投稿

次の投稿 →