Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?
Organization

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メソッドを行うことが出来る。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?