LoginSignup
19

More than 5 years have passed since last update.

Laravelでオブザーバを試す

Last updated at Posted at 2018-03-01

Laravelのモデルでライフサイクル(新規作成した際や削除した際)に、合わせて処理を行うことができます。

$dispatchesEventsにイベントを登録する方法もありますが、今回はObserverを利用してみます。

Laravel:v5.6.5

試してみる

オブザーバの用意

Groupモデルに対応するオブザーバを用意する。

app/Observers/GroupObserver.php
<?php

namespace App\Observers;

use App\Group;

class GroupObserver
{
    public function saved(Group $group)
    {
        \Log::debug("Hoge");
    }
}

オブザーバの登録

Group::observeGroupObserverを登録します。

app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use App\Group;
use App\Observers\GroupObserver;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Group::observe(GroupObserver::class);
    }
}

実行

$ php artisan tinker

>>> $group = factory(App\Group::class)->make()
=> App\Group {...}
>>> $group->save();
=> true

factory使ってますが、用意してない方は、new App\Group()でよいと思います。

storage/logs/laravel.log
[2018-03-01 10:16:22] local.DEBUG: Hoge

オブザーバの順序

ついでに実行順序も気になったので確認してみます。

app/Observers/GroupObserver.php
<?php

namespace App\Observers;

use App\Group;

class GroupObserver
{
    public function creating(Group $group)
    {
        \Log::debug("GroupObserver: creating");
    }

    public function created(Group $group)
    {
        \Log::debug("GroupObserver: created");
    }

    public function saving(Group $group)                                                                                                  
    {
        \Log::debug("GroupObserver: saving");
    }

    public function saved(Group $group)
    {
        \Log::debug("GroupObserver: saved");
    }
}
app/Group.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Group extends Model
{
    public function save(array $options = [])
    {
        \Log::debug("Group: before save");
        $saved = parent::save($options);
        \Log::debug("Group: after save");                                                                                                
        return $saved;
    }
}

先ほどと同じ様にtinkerで実行

storage/logs/laravel.log
[2018-03-01 16:57:28] local.DEBUG: Group: before save  
[2018-03-01 16:57:28] local.DEBUG: GroupObserver: saving  
[2018-03-01 16:57:28] local.DEBUG: GroupObserver: creating  
[2018-03-01 16:57:28] local.DEBUG: GroupObserver: created  
[2018-03-01 16:57:28] local.DEBUG: GroupObserver: saved  
[2018-03-01 16:57:28] local.DEBUG: Group: after save

ふむ、わからん。
creatingcreatedの間で実際のsaveが行われてそうな気がしますね。

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
19