1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel8.x】observerでEloquentモデルのイベントをディスパッチする

Last updated at Posted at 2022-01-03

はじめに

Eloquentに用意されているobserverを利用してsaveメソッドを検知して処理を追加する方法を備忘録として紹介します

解消する問題

1.ログインユーザー名を取得する
2.1とモデルインスタンスに属性の配列を加えた配列を結合
3.save()メソッドで登録する

1.2の処理を更新時にも同じ処理を記述するのはイケてないのでobserverにやってもらいます

$loginUser = Auth::user()->name;

$storeData = array_merge(
    (new User())->fill($request->all())->toArray(),
    ['create_user' => $loginUser],
    ['update_user' => $loginUser],
);

$result = (new User())->fill($storeData)->save();

やり方

observerを生成

php artisan make:observer UserObserver --model=User

observerに処理を定義

  • 今回はsave()が成功した後に登録者・更新者を登録したいのでsaved()メソッドを利用

saved(User $user):$userにはsave()メソッドの結果(登録したユーザーのモデルインスタンス情報)が入ります

src/laravel/app/Observers/UserObserver.php
<?php

namespace App\Observers;

class UserObserver
{
    /**
     * Handle the user "save" event.
     *
     * @param User $user
     * @return void
     */
    public function saved(User $user): void
    {
        $loginUser = Auth::user()->name;
        $saveData = [
            'create_user' => $loginUser,
            'update_user' => $loginUser
        ];

        User::query()->where('id', $user->id)->update($saveData);
    }
}

observerAppServiceProviderで読み込む

src/laravel/app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(): void
    {
        User::observe(UserObserver::class);
    }
}

observerに移した処理を削る

スッキリかけました

なお、今回observerでクエリビルダでupdateしていますがsave()メソッドを利用したい場合はsaveQuietly()メソッドを利用してください

save()メソッドをobserverで実行するとイベントをディスパッチしてしまうので処理が終わりません
必ずsaveQuietly()メソッドを利用するようにしてください

$result = (new User())->fill($request->all())->save();

おわりに

今回は簡単な例でobserverについて紹介しました
登録前の処理はsaving・削除前はdeleting等、イベントを検知することでビジネスロジックがスッキリ書ける場合もあるので使ってみるといいかもしれません。
この記事が参考になれば幸いです

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?