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::observe
にGroupObserver
を登録します。
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
ふむ、わからん。
creating
とcreated
の間で実際のsave
が行われてそうな気がしますね。