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()]] メソッドを呼び出して、イベントにハンドラーをアタッチします。例: - リーリー
イベントハンドラーの順序
1 つ以上のハンドラーをイベントにアタッチできます。イベントがトリガーされると、アタッチされたハンドラーがアタッチされた順序で呼び出されます。プロセッサが後続のプロセッサ呼び出しを停止する必要がある場合は、次のように、 パラメータの [yiibaseEvent::handled]] 属性を true に設定できます。 リーリー
デフォルトでは、新しくアタッチされたイベント ハンドラーは、既存のハンドラー キューの最後に配置されます。したがって、このハンドラーは、イベントがトリガーされたときに最後に呼び出されます。プロセッサ キューの先頭に新しいプロセッサを挿入すると、このプロセッサが最初に呼び出されます。4 番目のパラメータ を false として渡し、 [[yiibaseComponent::on()]] メソッドを呼び出して実装します。 $event
リーリー
イベントは [[yiibaseComponent::trigger()]] メソッドを呼び出すことによってトリガーされます。このメソッドは イベント名$append
を渡す必要があります。イベント ハンドラーにパラメーターを渡すためにイベント オブジェクトを渡すこともできます。例:
リーリー
bar()
を呼び出すと、 という名前のメッセージがトリガーされます。こんにちは
イベント。
ヒント: イベント名を表すにはクラス定数を使用することをお勧めします。上の例では、定数 。これには 2 つの利点があります。まず、タイプミスを防止し、IDE のオートコンプリートをサポートします。次に、定数の宣言を調べるだけで、クラスがどのイベントをサポートしているかを知ることができます。 bar()
,它将触发名为 hello
イベントがトリガーされたときに、追加情報をイベント ハンドラーに渡したい場合があります。たとえば、メール プログラムは、どのメッセージが送信されたかをハンドラーが認識できるように、
リーリー
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")。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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