10
9

More than 5 years have passed since last update.

LaravelのモデルでRailsでいうbefore/afterフィルタしてみた

Last updated at Posted at 2018-07-06

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を利用すればなんとかできる。
10
9
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
10
9