【Laravel】もう面倒くさくない!オブザーバでイベントを管理

2021年8月5日

こんにちは。今回はLaravelのオブザーバ機能を解説していきます。Eloquentのイベントをまとめて登録できるため運用がかなり楽になります。個人的にかなり気に入っている機能ですので、オススメです。それではみていきましょう。

オブザーバとは

ある特定のEloquentモデルのイベントをひとまとめにできるオブジェクトです。オブザーバを使用しない場合、1イベントずつ専用のクラスを作成しなくてはなりません。これが正直結構面倒くさいのです。オブザーバを使えば、ある特定のEloquentモデルのイベントを1つのクラスにまとめることができるので、クラスを作る手間が解消されます。

今回はUserクラスのオブザーバを実際に作成し、その便利さを検証していきたいと思います。

オブザーバを作成する

オブザーバクラスを作る

make:observerコマンドでUserモデルのオブザーバを作成します。–model=Userオプションを付与することで、オブザーバ内でUserモデルが使えるようにコードを生成してくれます。

$ php artisan make:observer UserObserver --model=User

# 成功時のメッセージ
Observer created successfully.

UserObserverはapp/Observersフォルダに作成されます。UserObserverクラスの中には、createdやupdatedなど、よく使用するイベントのメソッドが既に作成されていますので、あとは処理を書いていくだけです。使用頻度が低いイベントは自動生成されないので、必要に応じてクラスに追加しましょう。イベントは公式ドキュメントで確認できます。(https://readouble.com/laravel/8.x/ja/eloquent.html#events

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "restored" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function restored(User $user)
    {
        //
    }

    /**
     * Handle the User "force deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

イベントの処理を記述する

今回はcreatedイベントに処理を記述してみます。createdはモデル作成時に発火するイベントで、作成されたUserモデルを引数に取ります。ログを出力して作成されたUserモデルのnameを出力してみましょう。

    public function created(User $user)
    {
        \Log::debug('user created. name=' . $user->name);
    }

オブザーバをサービスプロバイダに登録する

オブザーバはサービスプロバイダに登録します。せっかく作成してもプロバイダに登録しないと動作しませんので注意が必要です。EventServiceProviderのbootメソッドに登録しましょう。

use App\Models\User;
use App\Observers\UserObserver;    

class EventServiceProvider extends ServiceProvider
{
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

オブザーバを実行する

作成したオブザーバを実行してみましょう。今回はUserモデル作成時のイベント(created)を登録しましたので、Userモデルのデータを1件登録してみてください。以下のようにログが出力されれば成功です。

[2021-08-03 02:39:21] local.DEBUG: user created. name=saimon 

まとめ

いかがでしょうか。1つのEloquentモデルで複数のイベントを作成する場合に便利に使えそうです。私としては、オブザーバを作る手順が簡単なので、積極的にオブザーバを使おうと思いました。Eloquentクラスと1対1で作成しておけば、ファイルも探しやすくなります。

イベント作成するのが面倒と感じた方は、是非使ってみてください。

Laravel

Posted by kobainmac