LoginSignup
35
34

More than 5 years have passed since last update.

Laravel5でModelイベントのハンドラを登録する

Posted at

あるModelのアイテムを削除したときに関連Modelも削除したり、ストレージのデータを削除したりしたいことがある。

Laravel5のModelには以下のようにイベントが定義されている。

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
    public function getObservableEvents()
    {
        return array_merge(
            array(
                'creating', 'created', 'updating', 'updated',
                'deleting', 'deleted', 'saving', 'saved',
                'restoring', 'restored',
            ),
            $this->observables
        );
    }

それぞれのイベントにハンドラを登録するときは以下のように各モデルのbootメソッドで実装。

app/Models/Sample.php
class Sample extends Model
{
    protected $table = 'samples';

    protected static function boot()
    {
        parent::boot();

        self::updating(function($sample){
            return $sample->onUpdatingHandler();

        });
        self::deleted(function($sample){
            $sample->onDeletedHandler();
        });
    }

    private function onUpdatingHandler()
    {
        //update時刻を記録したり何かする
        return true; //キャンセルしたいときはfalseを返す
    }

    private function onDeletedHandler()
    {
        //ストレージデータを削除したり関連Modelを削除したりする
    }
}

updatingやdeletingなどのing系イベントはfalseを返すとキャンセルされる。

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
            if ($this->fireModelEvent('deleting') === false) return false;
35
34
0

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
  3. You can use dark theme
What you can do with signing up
35
34