こんにちは。CREの豊田(とよひろ)です。
以前LaravelのbootTraitsという便利なメソッドを発見したので記事にしたいと思います。
TL;DR
例えば、slackに通知したいとかアラートを出したいといった時に使えそうな便利な実装方法!
Itemテーブルなど、テーブル保存時に、ログを入れたいなどといったシーンで共通処理をいちいちコントローラー側に書いていくのはかなり大変ですよね。
Traitで共通処理を記載し、LaravelのModel.phpのbootTraits()メソッドをうまく使うと実現できます。
bootTraitsメソッドとは?
自身に使われているtraitの一覧を取得します。
つまり、使用しているクラス内のTraitの中にある「boot + Traitのクラス名」メソッドに対して、処理を行うことができます。
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) { // 共通処理 }); } }
このようにしてあげることで本来、各コントローラーに記載しないといけないものがbootTraitsによってログを取れるようになります!
ぜひ試してみてください!
終わりに
リファレンスに記載されていないライブラリでも結構面白い、または便利なものがあったりします!!
github散歩等で触れたことのないライブラリを見つけてみるのも面白いかもしれません!😊