目次
イベントハンドラー
bar()" >bar()
移除事件处理器
类级别的事件处理器
全局事件
ホームページ php教程 php手册 Yii2を深く学ぶ -- イベント

Yii2を深く学ぶ -- イベント

Jul 06, 2016 pm 01:30 PM
event yii2 イベント 勉強 私たち 深く行く

まず Yii2 でのイベントの使用方法を見てみましょう。以下の内容は Yii2 の中国語ドキュメントから抜粋したものです。イベントは既存のコードの特定の実行ポイントにカスタム コードを挿入できます。カスタム コードをイベントにアタッチすると、イベントがトリガーされたときにコードが自動的に実行されます。たとえば、メーラー オブジェクトがメッセージの送信に成功したときに、messageSent イベントを発生させることができます。よかったら

まず Yii2 でのイベントの使用方法を見てみましょう。以下の内容は Yii2 中国語ドキュメントからの引用です

イベントは、既存のコードの特定の実行ポイントにカスタム コードを「挿入」できます。カスタム コードをイベントにアタッチすると、イベントがトリガーされたときにコードが自動的に実行されます。たとえば、メーラー オブジェクトがメッセージを正常に送信したときに messageSent 事件。如想追踪成功发送的消息,可以附加相应追踪代码到 messageSent イベントをトリガーできます。

Yii は、イベントをサポートするために [[yiibaseComponent]] という名前の基本クラスを導入します。クラスがイベントをトリガーする必要がある場合、[[yiibaseComponent]] またはそのサブクラスを継承する必要があります。

イベントハンドラー

イベント ハンドラーは、関連付けられているイベントがトリガーされたときに実行される php コールバック関数です。次のコールバック関数のいずれかを使用できます:

  • などの文字列形式で指定された PHP グローバル関数。 'trim' など、オブジェクト名とメソッド名の配列形式で指定されたオブジェクト メソッド。
  • クラス名とメソッド名の配列形式で指定された静的クラスメソッド (
  • など) [$object, $method]などの匿名関数。
  • [$class, $method]イベントハンドラーの形式は次のとおりです:
  • リーリー
  • function ($event) { ... }

パラメーターを通じて、イベント ハンドラーはイベントに関する次の情報を取得します:

[[yiibaseEvent::name|イベント名]]: イベント名$event [[yiibaseEvent::sender|イベント送信者]]: メソッドを呼び出すオブジェクト

    [[yiibaseEvent::data|custom data]]: イベントハンドラーをアタッチするときに渡されるデータ。デフォルトは空です。詳細は以下で説明します
  • 追加のイベントハンドラーtrigger()
  • [[yiibaseComponent::on()]] メソッドを呼び出して、イベントにハンドラーをアタッチします。例:
  • リーリー
イベントハンドラーをアタッチするとき、[[yiibaseComponent::on()]] メソッドの 3 番目のパラメーターとして追加データを指定できます。イベントがトリガーされてハンドラーが呼び出されたときに、ハンドラーはデータを利用できます。例:

リーリー

イベントハンドラーの順序

1 つ以上のハンドラーをイベントにアタッチできます。イベントがトリガーされると、アタッチされたハンドラーがアタッチされた順序で呼び出されます。プロセッサが後続のプロセッサ呼び出しを停止する必要がある場合は、次のように、 パラメータの [yiibaseEvent::handled]] 属性を true に設定できます。 リーリー

デフォルトでは、新しくアタッチされたイベント ハンドラーは、既存のハンドラー キューの最後に配置されます。したがって、このハンドラーは、イベントがトリガーされたときに最後に呼び出されます。プロセッサ キューの先頭に新しいプロセッサを挿入すると、このプロセッサが最初に呼び出されます。4 番目のパラメータ

を false として渡し、 [[yiibaseComponent::on()]] メソッドを呼び出して実装します。 $event リーリー

トリガーイベント

イベントは [[yiibaseComponent::trigger()]] メソッドを呼び出すことによってトリガーされます。このメソッドは イベント名$append を渡す必要があります。イベント ハンドラーにパラメーターを渡すためにイベント オブジェクトを渡すこともできます。例: リーリー

上記のコードが

bar()

を呼び出すと、

という名前のメッセージがトリガーされます。こんにちはイベント。

ヒント: イベント名を表すにはクラス定数を使用することをお勧めします。上の例では、定数 。これには 2 つの利点があります。まず、タイプミスを防止し、IDE のオートコンプリートをサポートします。次に、定数の宣言を調べるだけで、クラスがどのイベントをサポートしているかを知ることができます。 bar() ,它将触发名为 hello イベントがトリガーされたときに、追加情報をイベント ハンドラーに渡したい場合があります。たとえば、メール プログラムは、どのメッセージが送信されたかをハンドラーが認識できるように、

イベントのハンドラーにメッセージ情報を渡す必要があります。これを行うには、[[yiibaseComponent::trigger()]] メソッドの 2 番目のパラメータとしてイベント オブジェクトを指定できます。このイベント オブジェクトは、[[yiibaseEvent]] クラスまたはそのサブクラスのインスタンスである必要があります。例:
リーリー

EVENT_HELLO 用来表示 hello [[yiibaseComponent::trigger()]] メソッドが呼び出されると、名前付きイベント (トリガー メソッドの最初のパラメーター) にアタッチされたすべてのイベント ハンドラーが呼び出されます。

移除事件处理器

从事件移除处理器,调用 [[yii\base\Component::off()]] 方法。如:

<span style="color: #008000;">//</span><span style="color: #008000;"> 处理器是全局函数</span>
<span style="color: #800080;">$foo</span>->off(Foo::EVENT_HELLO, 'function_name'<span style="color: #000000;">);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理器是对象方法</span>
<span style="color: #800080;">$foo</span>->off(Foo::EVENT_HELLO, [<span style="color: #800080;">$object</span>, 'methodName'<span style="color: #000000;">]);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理器是静态类方法</span>
<span style="color: #800080;">$foo</span>->off(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName'<span style="color: #000000;">]);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理器是匿名函数</span>
<span style="color: #800080;">$foo</span>->off(Foo::EVENT_HELLO, <span style="color: #800080;">$anonymousFunction</span>);
ログイン後にコピー

注意当匿名函数附加到事件后一般不要尝试移除匿名函数,除非你在某处存储了它。以上示例中,假设匿名函数存储为变量$anonymousFunction 。

移除事件的全部处理器,简单调用 [[yii\base\Component::off()]] 即可,不需要第二个参数:

<span style="color: #800080;">$foo</span>->off(Foo::EVENT_HELLO);
ログイン後にコピー

类级别的事件处理器

以上部分,我们叙述了在实例级别如何附加处理器到事件。有时想要一个类的所有实例而不是一个指定的实例都响应一个被触发的事件,并不是一个个附加事件处理器到每个实例,而是通过调用静态方法 [[yii\base\Event::on()]] 在类级别附加处理器。

例如,活动记录对象要在每次往数据库新增一条新记录时触发一个 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件。要追踪每个活动记录对象的新增记录完成情况,应如下写代码:

<span style="color: #0000ff;">use</span><span style="color: #000000;"> Yii;
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> yii\base\Event;
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> yii\db\ActiveRecord;

Event</span>::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, <span style="color: #0000ff;">function</span> (<span style="color: #800080;">$event</span><span style="color: #000000;">) {
    Yii</span>::trace(<span style="color: #008080;">get_class</span>(<span style="color: #800080;">$event</span>->sender) . ' is inserted'<span style="color: #000000;">);
});</span>
ログイン後にコピー

每当 [[yii\db\BaseActiveRecord|ActiveRecord]] 或其子类的实例触发 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件时,这个事件处理器都会执行。在这个处理器中,可以通过 $event->sender 获取触发事件的对象。

当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。

可调用静态方法[[yii\base\Event::trigger()]]来触发一个类级别事件。类级别事件不与特定对象相关联。因此,它只会引起类级别事件处理器的调用。如:

<span style="color: #0000ff;">use</span><span style="color: #000000;"> yii\base\Event;

Event</span>::on(Foo::className(), Foo::EVENT_HELLO, <span style="color: #0000ff;">function</span> (<span style="color: #800080;">$event</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$event</span>->sender;  <span style="color: #008000;">//</span><span style="color: #008000;"> 显示 "app\models\Foo"</span>
<span style="color: #000000;">});

Event</span>::trigger(Foo::className(), Foo::EVENT_HELLO);
ログイン後にコピー

注意这种情况下 $event->sender 指向触发事件的类名而不是对象实例。

Note: 因为类级别的处理器响应类和其子类的所有实例触发的事件,必须谨慎使用,尤其是底层的基类,如 [[yii\base\Object]]。

移除类级别的事件处理器只需调用[[yii\base\Event::off()]],如:

<span style="color: #008000;">//</span><span style="color: #008000;"> 移除 $handler</span>
Event::off(Foo::className(), Foo::EVENT_HELLO, <span style="color: #800080;">$handler</span><span style="color: #000000;">);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 移除 Foo::EVENT_HELLO 事件的全部处理器</span>
Event::off(Foo::className(), Foo::EVENT_HELLO);
ログイン後にコピー

全局事件

所谓全局事件实际上是一个基于以上叙述的事件机制的戏法。它需要一个全局可访问的单例,如应用实例。

事件触发者不调用其自身的 trigger() 方法,而是调用单例的 trigger() 方法来触发全局事件。类似地,事件处理器被附加到单例的事件。如:

<span style="color: #0000ff;">use</span><span style="color: #000000;"> Yii;
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> yii\base\Event;
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> app\components\Foo;

Yii</span>::<span style="color: #800080;">$app</span>->on('bar', <span style="color: #0000ff;">function</span> (<span style="color: #800080;">$event</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> <span style="color: #008080;">get_class</span>(<span style="color: #800080;">$event</span>->sender);  <span style="color: #008000;">//</span><span style="color: #008000;"> 显示 "app\components\Foo"</span>
<span style="color: #000000;">});

Yii</span>::<span style="color: #800080;">$app</span>->trigger('bar', <span style="color: #0000ff;">new</span> Event(['sender' => <span style="color: #0000ff;">new</span> Foo]));
ログイン後にコピー

全局事件的一个好处是当附加处理器到一个对象要触发的事件时,不需要产生该对象。相反,处理器附加和事件触发都通过单例(如应用实例)完成。

然而,因为全局事件的命名空间由各方共享,应合理命名全局事件,如引入一些命名空间(例:"frontend.mail.sent", "backend.mail.sent")。

 


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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語の魅力に迫る ~プログラマーの可能性を引き出す~ C言語の魅力に迫る ~プログラマーの可能性を引き出す~ Feb 24, 2024 pm 11:21 PM

C言語学習の魅力:プログラマーの可能性を引き出す テクノロジーの発展に伴い、コンピュータプログラミングは大きな注目を集めている分野です。数あるプログラミング言語の中でもC言語は常にプログラマーに愛されています。そのシンプルさ、効率性、幅広い用途により、C 言語の学習は、多くの人にとってプログラミングの分野に入る最初のステップとなっています。この記事では、C言語を学ぶ魅力と、C言語を学ぶことでプログラマーの可能性を引き出す方法について解説します。 C言語学習の魅力は、まずその簡単さにあります。他のプログラミング言語と比較すると、C言語は

Wordでルート番号を入力する方法を一緒に学びましょう Wordでルート番号を入力する方法を一緒に学びましょう Mar 19, 2024 pm 08:52 PM

Word でテキスト コンテンツを編集するときに、数式記号の入力が必要になる場合があります。 Word でルート番号を入力する方法を知らない人もいるので、Xiaomian は私に、Word でルート番号を入力する方法のチュートリアルを友達と共有するように頼みました。それが私の友達に役立つことを願っています。まず、コンピュータで Word ソフトウェアを開き、編集するファイルを開き、ルート記号を挿入する必要がある場所にカーソルを移動します。下の図の例を参照してください。 2. [挿入]を選択し、記号内の[数式]を選択します。下の図の赤丸で示すように: 3. 次に、下の[新しい数式を挿入]を選択します。以下の図の赤丸で示すように: 4. [根号式]を選択し、適切な根号を選択します。下の図の赤丸で示したように、

Go言語のmain関数をゼロから学ぶ Go言語のmain関数をゼロから学ぶ Mar 27, 2024 pm 05:03 PM

タイトル: Go言語のmain関数をゼロから学ぶ Go言語はシンプルで効率的なプログラミング言語として開発者に好まれています。 Go 言語では、main 関数はエントリ関数であり、すべての Go プログラムにはプログラムのエントリ ポイントとして main 関数が含まれている必要があります。この記事ではGo言語のmain関数をゼロから学ぶ方法と具体的なコード例を紹介します。 1. まず、Go 言語開発環境をインストールする必要があります。公式ウェブサイト (https://golang.org) にアクセスできます。

jQueryで選択要素の変更イベントバインディングを実装する方法 jQueryで選択要素の変更イベントバインディングを実装する方法 Feb 23, 2024 pm 01:12 PM

jQuery は、DOM 操作、イベント処理、アニメーション効果などを簡素化するために使用できる人気のある JavaScript ライブラリです。 Web 開発では、選択した要素のイベント バインディングを変更する必要がある状況によく遭遇します。この記事では、jQuery を使用して選択要素変更イベントをバインドする方法を紹介し、具体的なコード例を示します。まず、ラベルを使用してオプションを含むドロップダウン メニューを作成する必要があります。

PHP を使用してイベントベースのアプリケーションを構築する方法 PHP を使用してイベントベースのアプリケーションを構築する方法 May 04, 2024 pm 02:24 PM

PHP でイベントベースのアプリケーションを構築する方法には、EventSourceAPI を使用してイベント ソースを作成する方法と、EventSource オブジェクトを使用してクライアント側でイベントをリッスンする方法が含まれます。 Server Sent Events (SSE) を使用してイベントを送信し、XMLHttpRequest オブジェクトを使用してクライアント側でイベントをリッスンします。実際の例は、EventSource を使用して、電子商取引 Web サイトの在庫数をリアルタイムで更新することです。これは、サーバー側で在庫をランダムに変更して更新を送信することで実現され、クライアントは EventSource を通じて在庫の更新をリッスンし、それらを表示します。リアルタイム。

jQueryの閉じるボタンイベントの詳細 jQueryの閉じるボタンイベントの詳細 Feb 24, 2024 pm 05:09 PM

jQuery の閉じるボタン イベントの詳細な理解 フロントエンド開発プロセスでは、ポップアップ ウィンドウを閉じる、プロンプト ボックスを閉じるなど、閉じるボタン機能を実装する必要がある状況によく遭遇します。人気の JavaScript ライブラリである jQuery を使用すると、閉じるボタン イベントの実装が非常に簡単で便利になります。この記事では、jQuery を使用して閉じるボタン イベントを実装する方法を詳しく説明し、読者がこのテクノロジをよりよく理解して習得できるように、具体的なコード例を示します。まず、定義方法を理解する必要があります。

Steam サマー セール - Valve が AAA ゲームの 95% オフを予告、バイラル ゲーム Palworld とコンテンツ警告の割引を確認 Steam サマー セール - Valve が AAA ゲームの 95% オフを予告、バイラル ゲーム Palworld とコンテンツ警告の割引を確認 Jun 26, 2024 pm 03:40 PM

Steam のサマー セールは、これまでいくつかの最高のゲームの割引を主催してきましたが、今年は Valve によるさらなるホームランが積み重なっているようです。 Steam サマーセールの割引ゲームの一部を紹介するトレーラー (以下をご覧ください) がリリースされました。

これらの 20 の Dune 分析ダッシュボードを理解し、チェーン上の傾向をすばやく把握します これらの 20 の Dune 分析ダッシュボードを理解し、チェーン上の傾向をすばやく把握します Mar 13, 2024 am 09:19 AM

オリジナル著者: Minty、暗号化 KOL オリジナル編集者: Shenchao TechFlow 使い方を知っていれば、Dune はオールインワンのアルファ ツールです。これらの 20 の Dune ダッシュボードを使用して、研究を次のレベルに引き上げましょう。 1. TopHolder 分析 @dcfpascal が開発したこのシンプルなツールは、ホルダーの月間アクティビティ、ユニークホルダー数、ウォレット損益率などの指標に基づいてトークンを分析できます。リンクを参照: https://dune.com/dcfpascal/token-holders2. トークンの概要メトリクス @andrewhong5297 がこのダッシュボードを作成し、ユーザーのアクションを分析してトークンを評価する方法を提供します。

See all articles