はじめに
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);
}
}
observer
をAppServiceProvider
で読み込む
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
等、イベントを検知することでビジネスロジックがスッキリ書ける場合もあるので使ってみるといいかもしれません。
この記事が参考になれば幸いです