ホームページ  >  記事  >  PHPフレームワーク  >  Thinkphp イベントメカニズムを実装する方法

Thinkphp イベントメカニズムを実装する方法

PHPz
PHPz転載
2023-06-02 17:37:22863ブラウズ
    #イベント メカニズムを実装するには、リスニングとサブスクリプションによる 2 つの方法があります。

    1. リスニングによる

    1. listen class : コマンドラインモードでフレームワークのルートディレクトリに入り、

    php think make:listener 13ebef09a18affb4c3b25f898e8269b6

    例:

    php think make:listener UserListener

    実行後、

    UserListener が cce70da58305dac6601d54f49bfa29af\app\listener## に生成されます#\ このクラス。 2. リスニングの設定: ファイル \app\event.php の listen 配列で UserListener クラスを次のように設定します:

    'listen' => [
    'testEvent' => ['app\listener\UserListener']

    ],

    3. リスニングをトリガーする: リスニングをトリガーする必要がある場所に次の行を追加します。コード
    event('testEvent');

    注: ここでのパラメータ testEvent はイベント名であり、任意に定義できますが、event.php ファイルで設定されたキー名と一致している必要があります。

    リスナーをトリガーするときに 2 番目のパラメーターを指定できます。ハンドル メソッドのパラメーターである 2 番目のパラメーターを介して、任意のデータを UserListener クラスに渡すことができます (意味がわからない場合は、以下の完全なコードを見て理解してください)。

    4. リスニング ロジックの処理: UserListener クラスの handle メソッドでビジネス ロジックを完成させます

    完全なコードは次のとおりです

    その他: テストに使用されるクラス

    <?php
    namespace app\controller;
    class Other
    {
        public function hello()
        {
            echo &#39;hello function&#39;;
        }
    }

    Index: リスニングをトリガーするクラス

    UserListener: イベント リスニング クラス

    <?php
    namespace app\listener;
    class UserListener
    {
        /**
         * 事件监听处理
         *
         * @return mixed
         */
        public function handle($event)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($event);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($event);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $event->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $event->hello();
        }
    }

    2.

    1 をサブスクライブして、サブスクリプション クラス ## を作成します。コマンド内の

    # ライン モードで、フレームワークのルート ディレクトリに入り、

    php think make:subscribe 13ebef09a18affb4c3b25f898e8269b6

    例:

    php think make:subscribe UserSubscribe

    実行後、UserSubscribe クラスが ac53bfb9ca280e594ef01e44320f8ef8\app\subscribe\ に生成されます。

    2. モニタリングの設定

    ファイル \app\event.php のサブスクライブ配列で UserSubscribe クラスを次のように設定します:

    'subscribe' => ['app\subscribe\UserSubscribe'],

    注: 効果をテストするには、上で構成した UserListener をリッスン配列から削除する必要があります

    3. トリガー監視

    最初の方法と同じ

    4. プロセス監視ロジック

    プロセス監視ロジックには 2 つの方法があり、これを自動バインディングと呼びます。手動バインディング。手動バインドと自動バインドは相互に排他的であり、どちらか一方のみを選択できます。

    4.1 自動バインディング

    ビジネス ロジックを完成させる ontestEvent メソッドを UserSubscribe クラスに追加する必要があります。追加するメソッド名は任意に定義することはできず、イベント名の前に追加するのがルールです。 event.php で定義したイベント名は testEvent であるため、メソッド名は ontestEvent になります (大文字と小文字に注意してください)。リスニング メソッドが定義されると、自動的にイベントにバインドされるため、これを自動バインディングと呼びます。
    完全なコードは次のとおりです。

    Other クラスと Index クラスのコードは最初のアプローチと同じです

    UserSubscribe: イベント サブスクリプション クラス

    <?php
    namespace app\subscribe;
    class UserSubscribe
    {
        public function ontestEvent($user)
        {
            //当调用Index类的test1方法时该代码有效,$event为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$event为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$event为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$event为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }

    4.2 手動バインディング

    まず、特定のビジネス ロジックの処理を担当するイベント クラスを作成します。コマンド ライン モードでフレームワークのルート ディレクトリを入力し、次を実行します:

    php think make:event <カスタマイズされたクラス名>

    #例:

    php think make:event UserEvent

    実行後、UserEvent クラスが ac53bfb9ca280e594ef01e44320f8ef8\app\event\ に生成されます。

    次に、このクラスに受信パラメータを持つハンドル メソッドを定義します。メソッド名と渡されるパラメータ名は任意に定義できます。特定のビジネス ロジックは handle メソッドで処理できます。

    次に、UserSubscribe クラスに Subscribe メソッドを追加します。このメソッドは、Event オブジェクトをパラメータとして受け取る必要があります。次に、この関数の UserEvent クラスのハンドル メソッドにイベント リスナーをバインドします。次のとおりです:

    $event->listen(&#39;testEvent&#39;, [app(&#39;app\event\UserEvent&#39;), &#39;handle&#39;]);

    完全なコードは次のとおりです

    Other クラスと Index クラスのコードは最初のアプローチと同じです

    UserSubscribe: イベント サブスクリプション クラス

    UserEvent: イベント処理クラス

    <?php
    declare (strict_types = 1);
    namespace app\event;
    class UserEvent
    {
        public function handle($user)
        {
            //当调用Index类的test1方法时该代码有效,$user为null
            var_dump($user);
            //当调用Index类的test2方法时该代码有效,$user为字符串hello
            var_dump($user);
            //当调用Index类的test3方法时该代码有效,$user为Index类的实例
            //可以访问Index类的name变量
            echo $user->name;
            //当调用Index类的test4方法时该代码有效,$user为Other类的实例
            //可以调用Other类的hello方法
            echo $user->hello();
        }
    }

    以上がThinkphp イベントメカニズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。