はじめに
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
メソッドには物理削除した後に行う処理を書く。
<?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クラス名
はそのクラスが呼び出された時にそこに書かれた処理を行う。
<?php
namespace App\Traits;
trait {Model名}Observable.php
{
public static function boot{Model名}Observable()
{
self::observe({Model名}Observer::class);
}
}
それを該当するModelsに呼び出す。
<?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メソッドを行うことが出来る。