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) {
// 共通処理
});
}
}