LaravelでRailsのbefore/afterフィルタみたいなのが作れるか確認してみた。
LaravelからMySQLのデータをいじってみたの続きっぽいもの。
環境
PHP 7.1.16
Laravel 5.6.26
実装
モデルに以下のような感じで書き足す。
Railsでどのフィルタに相当するかをコメントに記載した。
app/Bug.php
:
use Log;
:
protected static function boot()
{
parent::boot();
// たぶん該当なし
self::retrieved(function(Bug $bug)
{
Log::info('retrieved');
});
// before_create
self::creating(function(Bug $bug)
{
Log::info('creating');
});
// after_create
self::created(function(Bug $bug)
{
Log::info('created');
});
// before_update
self::updating(function(Bug $bug)
{
Log::info('updating:' . $bug . ':' . implode(",", $bug->getOriginal()));
});
// after_update
self::updated(function(Bug $bug)
{
Log::info('updated:' . $bug . ':' . implode(",", $bug->getOriginal()));
});
// before_save
self::saving(function(Bug $bug)
{
Log::info('saving');
});
// after_save
self::saved(function(Bug $bug)
{
Log::info('saved');
});
// before_destroy
self::deleting(function(Bug $bug)
{
Log::info('deleting');
});
// after_destroy
self::deleted(function(Bug $bug)
{
Log::info('deleted');
});
}
:
コンソールから実行してみる
php artisan tinker
update
$b = Bug::all()->first()
$b->hours = 1.2
$b->save()
↓
local.INFO: retrieved
local.INFO: saving
local.INFO: updating:{..."hours":1.5,...}:...1.20,...
local.INFO: updated:{..."hours":1.5,...}:...1.20,...
local.INFO: saved
delete
$b = Bug::all()->last()
$b->delete()
↓
local.INFO: retrieved
local.INFO: deleting
local.INFO: deleted
insert
$b = new Bug
$b->date_reported = '2018-05-06'
$b->save()
↓
local.INFO: saving
local.INFO: creating
local.INFO: created
local.INFO: saved
その他
- モデルを介さない操作では機能しない。
- 例えば
DB::table('bugs')->where('bug_id', 1)->update(['hours' => 1.5])
のような
- 例えば
-
ing
系はfalse
を返すと処理は完了しない(insert/update/deleteされない) -
updating/updated
のところで利用しているが、Railsで言う_change[0/1]
のようなものは$bug->getOriginal()
と$bug
を利用すればなんとかできる。