【Laravel】Eloquentモデルのイベント処理を実装する

今回はLaravelのイベント機能を使用して、Eloquentの作成、更新、削除のイベントを補足する方法を解説します。

イベントとは

LaravelではEloquentの生成、変更、削除時などにイベントを発生させます。発生したイベントにリスナーを登録しておくことで、リスナーがイベントに対する処理を行います。

今回やりたいこと

Laravelの初期状態で存在するUserモデルを利用します。User作成時のイベントを補足する手順を解説していきます。

ユーザー登録イベントを補足する

イベントとリスナーのオブジェクトを作成する

まずはイベントとリスナーのオブジェクトを作成しましょう。EventServiceProviderクラスの$listen内にUserCreatedイベントを登録します。そしてUserCreatedイベントの中にSendUserCreatedNotificationリスナーを登録します。これでUserCreatedイベントの発行時にSendUserCreatedNotificationリスナーが実行される設定ができました。


use App\Events\UserCreated;
use App\Listeners\SendUserCreatedNotification;

    protected $listen = [
		    UserCreated::class => [
			      SendUserCreatedNotification::class,
		    ]
    ];

EventServiceProviderにUserCreatedとSendUserCreatedNotificationを登録しましたが、クラス自体はまだ作成されていません。event:generateコマンドを実行してクラスを作成しましょう。event:generateコマンドはEventServiceProviderに登録したイベントとリスナーを自動生成するコマンドです。

php artisan event:generate

実行すると以下のファイルが作成されます。

  • app/Events/UserCreated.php(イベント)
  • app/Listeners/SendUserCreatedNotification.php(リスナー)

Userモデルでイベントをディスパッチ(発行)する

次にUserモデルの生成時イベントを補足する処理を記述していきます。app/Models/User.phpを編集し、$dispatchesEventsをオーバーライドします。’created’ => UserCreated::classを記述します。これはモデルのcreated(生成時イベント)を補足して先程作成したUserCreatedイベントクラスをディスパッチするという意味です。このように記述することで最終的にUserCreatedに紐づくSendUserCreatedNotificationリスナーが実行されます。

use App\Events\UserCreated;

class User extends Model
{
    protected $dispatchesEvents = [
        'created' => UserCreated::class
    ];
}

ではSendUserCreatedNotificationリスナーを編集します。リスナーの中にhandleメソッドが定義されており、その中に実行したい処理を記述していきます。今回はリスナーが呼ばれていることを確認するため、ログを出力します。

    public function handle(UserCreated $event)
    {
		    \Log::debug('user created');
    }

ここまででプログラミングは完了です。実際にUserモデルを作成してみましょう。SendUserCreatedNotificationのhandleメソッドが呼ばれて、ログが出力されるはずです。

まとめ

Eloquentのイベントには今回紹介したcreatedの他にもsaved(更新時)、deleted(削除時)など、いくつかの種類があります。Eloquentのライフサイクルに合わせて実行したい処理がある場合には、イベントを使用するのがおすすめです。

参考

https://readouble.com/laravel/8.x/ja/eloquent.html

Laravel

Posted by kobainmac