🍇

[Laravel] Observerで発生したイベントに応じた処理を実装する

2023/07/30に公開

Observerとは

特定のモデルに対して発生するイベントを監視し、発生したイベントに応じた処理を実行する役割を担っているのがObserverです。
例えば決済のモデルが存在するとして、変更を行った際に編集履歴を保存したいといったようにイベントに応じた処理を実装したい場合に使用されます。

Observerの作成

$ php artisan make:observer OBSERVER_NAME

で作成できます。(OBSERVER_NAMEは任意ですがObserver名となるのでモデル名+Observerとするのが良いでしょう。 例: UserObserver, ChargeObserver など)

Observerの使い方

Userモデルに対してObserverを実装していく場合を見ていきましょう.
今回は使用頻度が高い3つのイベントの場合のみについて解説します。3つ以外のイベントが発生した場合の処理も実装することができるので、その他のイベントについては以下を参照してください。

https://readouble.com/laravel/8.x/ja/eloquent.html#events

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
   public function created(User $user) 
   {
	// 登録処理をした際に行う処理
   }
   
   public function updated(User $user)
   {
        // 変更処理をした際に行う処理
   }
   
   public function deleted(User $user)
   {
        // 削除処理をした際に行う処理
   }
   
   // ...
}

それでは一つずつ見ていきましょう。

  • created

created内に記述された処理は、対象モデルのレコードが作成された時点(登録処理)で実行されます。

public function created(User $user)
{
	$this->sendEmail($user->email); // 登録されたユーザあてにメール送信が実行される
}
  • updated

updated内に記述された処理は、対象モデルのレコードに対して変更処理が行われた時に実行されます。
例えば、ユーザ情報の変更履歴を記録したい場合などに用いることになるでしょう。

public function updated(User $user)
{
    $beforeValue = $user->getOriginal('address'); // getOriginalで変更前の値を取得
    $afterValue = $user->address;
    
    $this->createUserHistory($beforeValue, $afterValue, $user); // 履歴を作成する関数
}

private function createUserHistory
(
    string $beforeValue,
    string $afterValue, 
    User $user
)
{
	...
}
  • deleted

deleted内に記述された処理は、対象モデルのレコードに対して削除処理が行われた時に実行されます。

public function deleted(User $user)
{
	$this->sendEmail($user->email, TriggerID::DELETE_USER)
}

最後に

今回紹介したイベントはごく一部で他にも多くのイベントが用意されているので
、ぜひご自分でも調べてみてください。
今回紹介したようにObserverをつかって楽にイベント後の処理を実装できるので、ぜひ実装に活かしていただけたらと思います。

Discussion