1
Help us understand the problem. What are the problem?

posted at

updated at

Laravelで任意のテーブルのデータ保存をフックに共通処理を行う

TL;DR

例えば、User, Itemテーブルなど、任意にテーブル保存時に、ログを入れたいなどそういったシーンで
共通処理をいちいちコントローラーに記載するのはかなり大変。
Traitで共通処理を記載し、LaravelのModel.phpのbootTraits()メソッドをうまく使うと実現できます。

LaravelからEloquentクラスを調査してみる

保存をフックにするので

src/Illuminate/Database/Eloquent/Model.php

この辺を見てみる。
そうすると...

    /**
     * Boot all of the bootable traits on the model.
     *
     * @return void
     */
    protected static function bootTraits()
    {
        $class = static::class;

        foreach (class_uses_recursive($class) as $trait) {
            if (method_exists($class, $method = 'boot'.class_basename($trait))) {
                forward_static_call([$class, $method]);
            }
        }
    }

なんと、boot + Trait名で書くと勝手に呼び出してくれるようです。

なので、これを元にTraitを作れば解決しそうです。

以下実装例


trait Hogefuga
{
    /**
     * 保存時に共通処理をする
     *
     * @return void
     */
    protected static function bootHogefuga()
    {
        static::created(function ($model) {
            // 作成する時の共通処理
        });
    }
}

あとは、共通処理を挟み込みたいmodelクラスにuseしてあげればOK

User.php
class User extends Eloquent
{
    use Hogefuga;

}
Item.php
class Item extends Eloquent
{
    use Hogefuga;

}

作成時以外も対応してみる

trait Hogefuga
{
    /**
     * 共通処理をする
     *
     * @return void
     */
    protected static function bootHogefuga()
    {
        static::created(function ($model) {
            // 共通処理
        });

        static::saved(function ($model) {
            // 共通処理
        });

        static::updated(function ($model) {
            // 共通処理
        });

        static::deleted(function ($model) {
            // 共通処理
        });
    }
}

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?