公開日:2023/1/15 最終更新日:2023/01/15

【Laravel】Eloquentモデルのイベントについて

カテゴリー: Laravel PHP

これも覚書。最近Laravel熱が高い。もし間違っている箇所があれば教えてください。

〇Eloquentモデルのイベントとは

モデルを作成する、モデルを更新する、モデルを削除するなどの処理を行う際に指定した処理を既存の処理に追加して実行することが出来るというもの。

モデルの新規作成時に処理を行いたい場合はcreatingを、モデルの更新時に処理を行い場合はupdatingをモデルファイルに定義することで追加の処理を登録できる。下にあるサンプルコードのように定義する。

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class User extends Model{

    protected static function booted()
    {
        /**
         * モデルの新規作成時に実行する処理
         */
        static::creating(function ($user) {
            // 
        });

        /**
         * モデルの更新時に実行する処理
         */
        static::updating(function ($user) {
            //
        });
    }
} 

これはEloquentモデルで定義する場合の書き方で、オブザーバーで定義する書き方も出来る。
オブザーバーで定義する場合は、別にオブザーバーファイルを作成してApp\Providers\EventServiceProviderにオブザーバークラスを登録する必要がある。

php artisan make:observer UserObserver --model=User
<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * モデルの新規作成が完了した場合に実行する処理
     */
    public function created(User $user)
    {
        //
    }
}

詳しい書き方はEloquentの準備 8.x Laravelを確認して欲しい。

登録できるイベントは複数あり、

retrievedcreatingcreatedupdatingupdatedsavingsaveddeletingdeletedrestoringrestoredreplicatingが利用できる。

ユーザーが何かしらのCRUDを実行した場合にメールを送信したい場合や、ユーザーが投稿を削除したときに関連する画像をstorageから削除する、などの機能を実装する際に利用できる。

updatingを定義が特定ルートの場合のみupdatingを適用したくない場合はwithOutEvents()を利用することでupdatingの処理をミュート出来る。

public function specialFunction(){
    $user = User::withOutEvents(function () use () {
        // 実行したい処理
        return User::findOrFail(1);
    });
}

公式ドキュメント:Eloquent: Getting Started – Laravel – The PHP Framework For Web Artisans

〇悩んでいる

モデルファイルでイベントの登録をする場合はモデルファイル内の記述が多くなるし、オブザーバークラスを作る場合はファイル数が増える&Providerで登録しないといけないし…。他にもやり方があるらしいが、PHPの基礎を理解出来ていないので下手に手を出せない。

いろいろ考えた。モデルファイルの記述が長くなるのはあまり好きではないので、オブザーバークラスを作成するやり方で書くことにした。完全に好み。

〇余談

アバター:ウェイ・オブ・ウォーターを観てきた。これだけの映画を2200円で観れるのかよ…。
映像がすごすぎる。1作目は未視聴だが全然いける。