Laravelでオブザーバーを使用してモデルの状態変化の操作を行い、コードをクリーンアップする


多くの場合、モデルを作成したり変更したときにアクションを実行する必要があります.
あなたがポストモデルを持っていると言うと、あなたは購読者に新しいポストの通知を送りたいかもしれません、あるいは、ポストが編集されるたびに、あなたは管理者に通知したいかもしれません.
どのような状況であれ、我々はこれらのアクションをこの作成または編集を処理するコントローラに置くのは自動的です.
それはオブザーバーがあなたのコントローラコードをきれいにして、これらの行動を確実にするためにステップを入れることができるところです、しかし、モデルは更新されます.

観察者とは何か
観測者はモデル状態が変化するときに引き起こされるメソッドを含むクラスです.フードの下で、ララベルはオブザーバーが聞くことができるイベントを引き起こします.
オブザーバはCREATE , UPDATE , DELETE , RESTRECT , FORHELELETEのアクションを実行できます.

When do Restored and forceDelete trigger?

These events are triggered on models that are using Soft Deletes, when either restoring or force deleting. Read more about soft deleting.


アイデアは、これらのアクションのいずれかがモデル上で実行されるたびに-どこに、またはどのように-あなたの行動を実行されます.
この例を考えてみましょう.

You have a Users model, and in your application users can update their own information. Admins can also update a user's information. These two updates will typically be performed by different controllers.

Add to this equation an artisan command that updates users in bulk somehow, or there may be a scheduled task that updates users information.

In all of these situations, there could be additional actions to perform other than the update itself - such as notifying the user of the change, or logging the change for admin purposes.

It doesn’t make sense to have this duplication of code - if you wanted to change how these actions or fix a bug you’d have to do it 4 times.


それはオブザーバーの完全なユースケースです.それは変更を聞くし、毎回アクションを実行します.

オブザーバーの作成
今、あなたは言う以下のワッフルステフ、どのように私はこれを行うのですか
さて、ここに行く.オブザーバーを生成するための職人コマンドがあります.
php artisan make:observer UserObserver --model=User
これはオブザーバディレクトリ内のクラスを作成し、その新しいクラスを開くと以下のようになります.
<?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)
    {
        //
    }

    public function restored(User $user)
    {
        //
    }

    public function forceDeleted(User $user)
    {
        //
    }
}
ご覧のように、作成、更新、削除、復元、強制的なメソッドがあります.
これらのメソッドはモデルをパラメータとして受け入れます.
そして、全く簡単に、あなたは先に行くことができますし、これらのメソッドで必要なアクションを実行!
ここでは、更新時に通知を送信する例を示します.
use App\Notifications\UserUpdated;

...

public function updated(User $user)
{
    $user->notify(new UserUpdated($user));
}
単純な権利?

観測者の登録
Laravelにオブザーバーを使用させるために一つの最終的なことがあります-登録する必要があります.
これを行うには、私たちのbootサービスプロバイダのApp\Providers\EventServiceProviderメソッドに以下を追加します.
use App\Models\User;
use App\Observers\UserObserver;

...

public function boot()
{
    User::observe(UserObserver::class);
}
さて、ララベルはオブザーバーのメソッドを使用します.

観察者の跳躍
オブザーバーは素晴らしいですが、実行したくない状況があるかもしれません.
それは私たちが前に述べたスケジュールされたタスクは、ユーザーが毎回通知する必要はありませんので、いくつかのクリーンアップを行うだけである可能性があります.
その場合は、代わりにsaveSettlyメソッドを使用できます.
$user->saveQuietly();

更なる読書
もちろん、ラーラーベルのドキュメントには、オブザーバーの使用方法を詳細に説明するセクションが含まれています.Be sure to head over there to read more about them .

観測者:
そして、あなたがそれを持っている場合、オブザーバーは、モデルの変更に反応し、コードを複製するのではなく、1つの場所でアクションを実行する素敵なクリーンな方法を与える.
あなたがObservversまたはLaravelについての質問をするならば、あるいは、この記事についてのどんなフィードバックでも、下記のコメントを私に落としてください-私はいつもコードについて雑談しています!
次回まで、ハッピーコーディング.