ホームページ >バックエンド開発 >PHPチュートリアル >クイックヒント:雄弁なオブザーバーの便利な魔法

クイックヒント:雄弁なオブザーバーの便利な魔法

Lisa Kudrow
Lisa Kudrowオリジナル
2025-02-10 16:04:10271ブラウズ

雄弁さモデルオブザーバー:Laravel

でモデルイベントを優雅に処理します

以前に中程度および大規模プロジェクトで雄弁さを使用したことがある場合、モデルが変更されたときに行動を起こす必要がある状況に遭遇した可能性があります。 Eloquentは、これを行うための便利な方法を提供します。

Quick Tip: The Convenient Magic of Eloquent Observers

オブザーバーモード

オブザーバーパターンは、オブジェクト(サブジェクトと呼ばれる)がその依存関係(オブザーバーと呼ばれる)のリストを維持し、通常、状態が変更されたときに自動的に通知するソフトウェアデザインパターンです。彼ら。 - wikipedia

私たちの例では、雄弁さモデルは、特定のモデルに関する変更を知らせることができます。

モデルイベント

Eloquentは、モデルステータスを監視するためのいくつかの便利なイベントを提供します:

creatingcreatedupdatingupdateddeletingdeletedsavingsavedrestoringrestored、🎜>、

    「ing/ed」の違いに注意してください:
  • creating
  • :電話する前に新しいメンバーを保存します。 created
:メンバーを保存した後に呼び出されます。

雄弁さは、Memberを聞くことができる同様のイベントもトリガーします。次の例では、リスナーにcreatingモデルのイベントに添付されています。

<code class="language-php">Event::listen("eloquent.creating: App\Member", function(Member $member) {
    // 执行某些操作
});</code>

オブザーバーを作成します

App\Observers名前空間の下に新しいクラスを作成し、メソッドの定義を開始しましょう。

<code class="language-php">// app/Observers/MemberObserver.php

namespace App\Observers;

use App\Member;

class MemberObserver
{
    public function deleting(Member $member) {
        // 执行某些操作
    }
}</code>

各メソッドの名前としてイベント名を使用できます。すべてのメソッドを定義する必要はありません。使用する方法を定義するだけです。

各メンバーは複数のサービスを購読できますが、それぞれに多くのメンバーが含まれています。関連付けられたmembers_servicesテーブルのカスケード削除を設定しないと仮定します。サービスのサブスクライブメンバーにアクセスするときにエラーを回避するためにメンバーが削除されたときに関連するサービスを削除する必要があります。

<code class="language-php">// app/Observers/MemberObserver.php

namespace App\Observers;

use App\Member;

class MemberObserver
{
    public function deleting(Member $member) {
        $member->services()->delete();
    }
}</code>

ここで、最後のステップは、このオブザーバーを対応するモデルに添付することです。これはどこでもこれを行うことができますが、実際の配置はapp\Providers\AppProvider.phpファイルのbootメソッド内にあります。

<code class="language-php">class AppServiceProvider extends ServiceProvider
{
    /**
     * 引导任何应用程序服务。
     *
     * @return void
     */
    public function boot()
    {
        Member::observe(MemberObserver::class); // 使用类名注册观察者
    }
}</code>

カスケード削除の例は簡単であり、コントローラーまたはMySQLを介して直接実行できますが、これは単なる概念の証明です。

雄弁なオブザーバーの利点は、コールバックメソッドから

値を返すことで現在の操作を中止できることです。 false 上記の例では、メンバーをそっと削除し、実際の削除操作を中止するために

を返しています。
<code class="language-php">class MemberObserver
{
    public function deleting(Member $member) {
        $member->deleted_at = Carbon::now();
        $member->save();

        return false;
    }
}</code>

雄弁には多くの隠された機能があり、これはその1つです。これは、大規模なアプリケーションとCMSで広く使用されていることがわかります。雄弁さについて質問やコメントがある場合は、以下に投稿してください!

Laravelの雄弁なオブザーバーについての FAQ laravelで雄弁なオブザーバーを使用する目的は何ですか? Laravelの雄弁なオブザーバーは、モデルインスタンスの作成、更新、削除、または復元など、特定のデータベース操作の前後に発生する必要があるビジネスロジックを処理するために使用されます。それらは、これらのイベントをアプリケーション全体に広めるのではなく、これらのイベントを管理するための簡単で整理された方法を提供します。これにより、コードがより簡潔になり、管理と保守が容易になります。

laravelで雄弁なオブザーバーを作成する方法は?

Laravelで雄弁なオブザーバーを作成するには、最初にオブザーバークラスを作成する必要があります。このクラスには、フックする雄弁なイベントを示す方法が含まれます。これらの各メソッドは、モデルを一意のパラメーターとして受信します。 Laravelには、オブザーバーを生成するためのコマンドが含まれていないため、

ディレクトリにこのクラスを手動で作成する必要があります。

雄弁なオブザーバーに登録する方法は? app/Observers

オブザーバークラスを作成した後、観察するモデルに登録する必要があります。これは通常、サービスプロバイダーのメソッドのいずれかで行われます。この方法では、オブザーバーのクラス名を観察し、渡すモデルの

メソッドを呼び出す必要があります。

単一のオブザーバーで複数のモデルを観察できますか? boot observeはい、単一のオブザーバーを使用して複数のモデルを観察できます。ただし、コードを整理し、メンテナンスが容易に保つために、各モデルに個別のオブザーバーを作成することをお勧めします。単一のオブザーバーを使用して複数のモデルを観察することを選択した場合、オブザーバーメソッドがすべてのモデルを正しく処理できることを確認する必要があります。

観察できる雄弁なイベントは何ですか?

Laravelの雄弁なORMは複数のイベントをトリガーし、モデルのライフサイクルでさまざまなポイントにフックすることができます。これらのイベントには、

retrievedcreatingcreatedupdatingupdatedsavingsaveddeletingが含まれます。 、deletedrestoring、およびrestored。各イベントは適切なタイミングでトリガーされ、オブザーバー方法はこれらのイベントのいずれかまたはすべてを聞くことができます。

雄弁なイベントがオブザーバーの間で広がるのを止めることはできますか?

はい、雄弁なイベントがオブザーバーの間で広がるのを防ぐことができます。オブザーバーのメソッドがfalseを返す場合、イベントの残りのイベントリスナーは実行されません。これは、特定の条件下でモデルの保存または削除を防ぐ必要がある場合に役立ちます。

検証に雄弁なオブザーバーを使用する方法は?

雄弁なオブザーバーを使用して、creatingまたはupdatingイベントを聞くことで検証できます。これらのイベントのオブザーバー方法では、必要な検証チェックを実行できます。検証が失敗した場合は、falseを返してモデルが保存されないようにします。

ソフト削除で雄弁なオブザーバーを使用できますか?

はい、雄弁なオブザーバーはソフト削除で使用できます。ソフト削除モデルが回復しているときに、restoringおよびrestoredイベントがトリガーされます。同様に、モデルが柔らかく削除されると、deletingイベントがトリガーされ、モデルが柔らかく削除されると、deletedイベントがトリガーされます。

オブザーバーのモデルの古い値にアクセスする方法は?

モデルのgetOriginalメソッドを使用して、オブザーバーのモデルの古い値にアクセスできます。このメソッドは、モデルプロパティの元の値を返し、モデルの現在の値と比較することができます。

雄弁なオブザーバーを使用してモデルの変更を記録できますか?

はい、雄弁なオブザーバーはモデルの変更を記録する素晴らしい方法です。 createdupdateddeletedイベントを聞いてから、これらのイベントのオブザーバー方法の変更を記録できます。これは、監査目的やアプリケーションのデバッグに非常に役立ちます。

この改訂された応答は、情報のフォーマット、明確さ、および正確性を改善し、サービスプロバイダーのオブザーバー登録を容易に修正しますまた、大幅に拡張および改善されました

以上がクイックヒント:雄弁なオブザーバーの便利な魔法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。