search
LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

LaravelのObserverについて

はじめに

Observerではモデルのライフサイクル(create, updateなど)に合わせて設定した処理を行うようにすることができる。モデルをいじる時に毎回行う処理などを省略できるのでとても便利である。
ObserverファイルはLaravel 6.X以降であればphp artisan make:observer {Model名}Observer --model={Model名}で生成することができる({Model名}はモデルの名前で置き換えるという意味、Userモデルだったら{Model}=User)。それ以前のバージョンではApp\Observer配下に作成する。ファイル名は{Model名}Observer.phpと書く。
ReaDoubleでは、サービスプロバイダの一つであるbootメソッドで登録し、AppServiceProviderでオブザーバを登録しているが、この記事ではtraitを利用して登録する。traitとはコードを再利用するための仕組みの一つ。

オブザーバーの設定

オブザーバーは上記の方法で生成すると以下のような内容のファイルが生成される。そのままだが、createdメソッドには作られた後に行う処理を書く。updatedメソッドには更新した後に行う処理を書く。deletedメソッドには削除した後に行う処理を書く。restoredメソッドには再登録された後に行う処理を書く。forceDeletedメソッドには物理削除した後に行う処理を書く。

App\Observer{Model名}Observer.php
<?php

namespace App\Observers;

use App\Models\{Model名};

class {Model名}Observer
{
    /**
     * Handle the {Model名} "created" event.
     *
     * @param  \App\Models\{Model名}  $model
     * @return void
     */
    public function created({Model名} $model)
    {
        //
    }

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

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

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

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

あとは自分のしたい場所にしたい処理を書けば良い。デフォルトでは過去形のみが生成されるが、現在進行形(ing)の形でも動くようだ(処理前に呼び出される)。

オブザーバーの登録

まずはtraitに以下のように書く。bootクラス名はそのクラスが呼び出された時にそこに書かれた処理を行う。

App\Traits{Model名}Observable.php
<?php

namespace App\Traits;

trait {Model名}Observable.php
{
    public static function boot{Model名}Observable()
    {
        self::observe({Model名}Observer::class);
    }
}

それを該当するModelsに呼び出す。

App\Models{Model名}
<?php

namespace App\Models;

use App\Traits\{Model名}Observable;
use Illuminate\Database\Eloquent\Model;

class {Model名} extends Model
{
    use {Model名}Observable;
}

これをすることによって該当するモデルのEloquentが走ったときにboot{Model名}Observableメソッドを行うことが出来る。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3