Yii2-Event を使用したディープラーニング
Yii2 の詳細な学習 - イベント
まず、Yii2 でのイベントの使用方法を見てみましょう。 以下の内容は Yii2 中国語ドキュメントからの抜粋です
イベントは既存のコードにカスタム コードを「挿入」できます。のコード固有の実行ポイント。カスタム コードをイベントにアタッチすると、イベントがトリガーされたときにコードが自動的に実行されます。たとえば、メーラー オブジェクトがメッセージの送信に成功すると、messageSent
イベントをトリガーできます。正常に送信されたメッセージを追跡したい場合は、対応する追跡コードを messageSent
イベントに添付できます。
Yii は、イベントをサポートするために [[yiibaseComponent]] という名前の基本クラスを導入します。クラスがイベントをトリガーする必要がある場合、[[yiibaseComponent]] またはそのサブクラスを継承する必要があります。
イベント ハンドラー
イベント ハンドラーは、関連付けられたイベントがトリガーされたときに実行される PHP コールバック関数です。次のコールバック関数のいずれかを使用できます:
- 文字列形式で指定された PHP グローバル関数 (
'trim'
など); - オブジェクト名とメソッドの配列形式で指定されたオブジェクト メソッド
[$object, $method]
などの名前; - などのクラス名とメソッド名の配列の形式で指定された静的クラス メソッド
[$class, $method]
などの匿名関数🎜>。 function ($event) { ... }
イベント ハンドラーの形式は次のとおりです。
function ($event<span>) { // $event 是 yii\base\Event 或其子类的对象}</span>
$event
- [[yiibaseEvent::sender|event sender]]: call メソッド
-
trigger()
[[yiibaseEvent::data|custom data]] のオブジェクト: イベント ハンドラーをアタッチするときに渡されるデータ。デフォルトは空です。詳細は以下で説明します - イベントのアタッチ ハンドラー
は [[yiibaseComponent::on()]] メソッドを呼び出して、ハンドラーをイベントにアタッチします。例:
$foo = new<span> Foo;// 处理器是全局函数$foo->on(Foo::EVENT_HELLO, 'function_name'<span>);// 处理器是对象方法$foo->on(Foo::EVENT_HELLO, [$object, 'methodName'<span>]);// 处理器是静态类方法$foo->on(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName'<span>]);// 处理器是匿名函数$foo->on(Foo::EVENT_HELLO, function ($event<span>) { //事件处理逻辑});</span></span></span></span></span>
// 当事件被触发时以下代码显示 "abc"// 因为 $event->data 包括被传递到 "on" 方法的数据$foo->on(Foo::EVENT_HELLO, function ($event<span>) { echo $event-><span>data;}, 'abc');</span></span>
は、1 つ以上のハンドラーをイベントにアタッチできます。イベントがトリガーされると、アタッチされたハンドラーがアタッチされた順序で呼び出されます。プロセッサが後続のプロセッサ呼び出しを停止する必要がある場合は、次のように
パラメータの [yiibaseEvent::handled]] 属性を true に設定できます:$event
$foo->on(Foo::EVENT_HELLO, function ($event<span>) { $event->handled = true<span>;});</span></span>
$append
$foo->on(Foo::EVENT_HELLO, function ($event<span>) { // 这个处理器将被插入到处理器队列的第一位...}, $data, false);</span>
イベント名
に加えて、イベント オブジェクトを渡してイベント ハンドラーにパラメータを渡すこともできます。例:
<span>namespace app\components;use<span> yii\base\Component;use<span> yii\base\Event;class Foo extends<span> Component{ const EVENT_HELLO = 'hello'<span>; public function<span> bar() { $this->trigger(self::<span>EVENT_HELLO); }}</span></span></span></span></span></span></span>
bar()
hello
ヒント: イベント名を表すにはクラス定数を使用することをお勧めします。上記の例では、定数
を表すために使用されます。これには 2 つの利点があります。まず、タイプミスを防止し、IDE のオートコンプリートをサポートします。次に、定数の宣言を調べるだけで、クラスがどのイベントをサポートしているかを知ることができます。イベントのハンドラーに渡す必要があります。これを行うには、[[yiibaseComponent::trigger()]] メソッドの 2 番目のパラメータとしてイベント オブジェクトを指定できます。このイベント オブジェクトは、[[yiibaseEvent]] クラスまたはそのサブクラスのインスタンスである必要があります。例:
EVENT_HELLO
hello
イベントがトリガーされたときに、追加情報をイベント ハンドラーに渡したい場合があります。たとえば、メール プログラムは、どのメッセージが送信されたかをハンドラーが認識できるように、メッセージ情報を
messageSent
<span>namespace app\components;use<span> yii\base\Component;use<span> yii\base\Event;class MessageEvent extends<span> Event{ public $message<span>;}class Mailer extends<span> Component{ const EVENT_MESSAGE_SENT = 'messageSent'<span>; public function send($message<span>) { // ...发送 $message 的逻辑... $event = new<span> MessageEvent; $event->message = $message<span>; $this->trigger(self::EVENT_MESSAGE_SENT, $event<span>); }}</span></span></span></span></span></span></span></span></span></span></span>
注意当匿名函数附加到事件后一般不要尝试移除匿名函数,除非你在某处存储了它。以上示例中,假设匿名函数存储为变量$anonymousFunction
。
移除事件的全部处理器,简单调用 [[yii\base\Component::off()]] 即可,不需要第二个参数:
$foo->off(Foo::EVENT_HELLO);
类级别的事件处理器
以上部分,我们叙述了在实例级别如何附加处理器到事件。有时想要一个类的所有实例而不是一个指定的实例都响应一个被触发的事件,并不是一个个附加事件处理器到每个实例,而是通过调用静态方法 [[yii\base\Event::on()]] 在类级别附加处理器。
例如,活动记录对象要在每次往数据库新增一条新记录时触发一个 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件。要追踪每个活动记录对象的新增记录完成情况,应如下写代码:
use<span> Yii;use<span> yii\base\Event;use<span> yii\db\ActiveRecord;Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event<span>) { Yii::trace(get_class($event->sender) . ' is inserted'<span>);});</span></span></span></span></span>
每当 [[yii\db\BaseActiveRecord|ActiveRecord]] 或其子类的实例触发 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件时,这个事件处理器都会执行。在这个处理器中,可以通过 $event->sender
获取触发事件的对象。
当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。
可调用静态方法[[yii\base\Event::trigger()]]来触发一个类级别事件。类级别事件不与特定对象相关联。因此,它只会引起类级别事件处理器的调用。如:
use<span> yii\base\Event;Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event<span>) { echo $event->sender; // 显示 "app\models\Foo"<span>});Event::trigger(Foo::className(), Foo::EVENT_HELLO);</span></span></span>
注意这种情况下 $event->sender
指向触发事件的类名而不是对象实例。
Note: 因为类级别的处理器响应类和其子类的所有实例触发的事件,必须谨慎使用,尤其是底层的基类,如 [[yii\base\Object]]。
移除类级别的事件处理器只需调用[[yii\base\Event::off()]],如:
// 移除 $handlerEvent::off(Foo::className(), Foo::EVENT_HELLO, $handler<span>);// 移除 Foo::EVENT_HELLO 事件的全部处理器Event::off(Foo::className(), Foo::EVENT_HELLO);</span>
全局事件
所谓全局事件实际上是一个基于以上叙述的事件机制的戏法。它需要一个全局可访问的单例,如应用实例。
事件触发者不调用其自身的 trigger()
方法,而是调用单例的 trigger()
方法来触发全局事件。类似地,事件处理器被附加到单例的事件。如:
use<span> Yii;use<span> yii\base\Event;use<span> app\components\Foo;Yii::$app->on('bar', function ($event<span>) { echo get_class($event->sender); // 显示 "app\components\Foo"<span>});Yii::$app->trigger('bar', new Event(['sender' => new Foo]));</span></span></span></span></span>
全局事件的一个好处是当附加处理器到一个对象要触发的事件时,不需要产生该对象。相反,处理器附加和事件触发都通过单例(如应用实例)完成。
然而,因为全局事件的命名空间由各方共享,应合理命名全局事件,如引入一些命名空间(例:"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)

ホットトピック









ログイン画面に「組織から PIN の変更を求められています」というメッセージが表示されます。これは、個人のデバイスを制御できる組織ベースのアカウント設定を使用しているコンピューターで PIN の有効期限の制限に達した場合に発生します。ただし、個人アカウントを使用して Windows をセットアップした場合、エラー メッセージは表示されないのが理想的です。常にそうとは限りませんが。エラーが発生したほとんどのユーザーは、個人アカウントを使用して報告します。私の組織が Windows 11 で PIN を変更するように要求するのはなぜですか?アカウントが組織に関連付けられている可能性があるため、主なアプローチはこれを確認することです。ドメイン管理者に問い合わせると解決できます。さらに、ローカル ポリシー設定が間違っていたり、レジストリ キーが間違っていたりすると、エラーが発生する可能性があります。今すぐ

Windows 11 では、新鮮でエレガントなデザインが前面に押し出されており、最新のインターフェイスにより、ウィンドウの境界線などの細部をカスタマイズして変更することができます。このガイドでは、Windows オペレーティング システムで自分のスタイルを反映した環境を作成するのに役立つ手順について説明します。ウィンドウの境界線の設定を変更するにはどうすればよいですか? + を押して設定アプリを開きます。 Windows [個人用設定] に移動し、[色の設定] をクリックします。ウィンドウの境界線の色の変更設定ウィンドウ 11" width="643" height="500" > [タイトル バーとウィンドウの境界線にアクセント カラーを表示する] オプションを見つけて、その横にあるスイッチを切り替えます。 [スタート] メニューとタスク バーにアクセント カラーを表示するにはスタート メニューとタスク バーにテーマの色を表示するには、[スタート メニューとタスク バーにテーマを表示] をオンにします。

デフォルトでは、Windows 11 のタイトル バーの色は、選択したダーク/ライト テーマによって異なります。ただし、任意の色に変更できます。このガイドでは、デスクトップ エクスペリエンスを変更し、視覚的に魅力的なものにするためにカスタマイズする 3 つの方法について、段階的な手順を説明します。アクティブなウィンドウと非アクティブなウィンドウのタイトル バーの色を変更することはできますか?はい、設定アプリを使用してアクティブなウィンドウのタイトル バーの色を変更したり、レジストリ エディターを使用して非アクティブなウィンドウのタイトル バーの色を変更したりできます。これらの手順を学習するには、次のセクションに進んでください。 Windows 11でタイトルバーの色を変更するにはどうすればよいですか? 1. 設定アプリを使用して + を押して設定ウィンドウを開きます。 Windows「個人用設定」に進み、

Windows インストーラー ページに「問題が発生しました」というメッセージとともに「OOBELANGUAGE」というメッセージが表示されますか?このようなエラーが原因で Windows のインストールが停止することがあります。 OOBE とは、すぐに使えるエクスペリエンスを意味します。エラー メッセージが示すように、これは OOBE 言語の選択に関連する問題です。心配する必要はありません。OOBE 画面自体から気の利いたレジストリ編集を行うことで、この問題を解決できます。クイックフィックス – 1. OOBE アプリの下部にある [再試行] ボタンをクリックします。これにより、問題が発生することなくプロセスが続行されます。 2. 電源ボタンを使用してシステムを強制的にシャットダウンします。システムの再起動後、OOBE が続行されます。 3. システムをインターネットから切断します。 OOBE のすべての側面をオフライン モードで完了する

タスクバーのサムネイルは楽しい場合もありますが、気が散ったり煩わしい場合もあります。この領域にマウスを移動する頻度を考えると、重要なウィンドウを誤って閉じてしまったことが何度かある可能性があります。もう 1 つの欠点は、より多くのシステム リソースを使用することです。そのため、リソース効率を高める方法を探している場合は、それを無効にする方法を説明します。ただし、ハードウェアの仕様が対応可能で、プレビューが気に入った場合は、有効にすることができます。 Windows 11でタスクバーのサムネイルプレビューを有効にする方法は? 1. 設定アプリを使用してキーをタップし、[設定] をクリックします。 Windows では、「システム」をクリックし、「バージョン情報」を選択します。 「システムの詳細設定」をクリックします。 [詳細設定] タブに移動し、[パフォーマンス] の下の [設定] を選択します。 「視覚効果」を選択します

Windows 11 のディスプレイ スケーリングに関しては、好みが人それぞれ異なります。大きなアイコンを好む人もいれば、小さなアイコンを好む人もいます。ただし、適切なスケーリングが重要であることには誰もが同意します。フォントのスケーリングが不十分であったり、画像が過度にスケーリングされたりすると、作業中の生産性が大幅に低下する可能性があるため、システムの機能を最大限に活用するためにカスタマイズする方法を知る必要があります。カスタム ズームの利点: これは、画面上のテキストを読むのが難しい人にとって便利な機能です。一度に画面上でより多くの情報を確認できるようになります。特定のモニターおよびアプリケーションにのみ適用するカスタム拡張プロファイルを作成できます。ローエンド ハードウェアのパフォーマンスの向上に役立ちます。画面上の内容をより詳細に制御できるようになります。 Windows 11の使用方法

画面の明るさは、最新のコンピューティング デバイスを使用する上で不可欠な部分であり、特に長時間画面を見る場合には重要です。目の疲れを軽減し、可読性を向上させ、コンテンツを簡単かつ効率的に表示するのに役立ちます。ただし、設定によっては、特に新しい UI が変更された Windows 11 では、明るさの管理が難しい場合があります。明るさの調整に問題がある場合は、Windows 11 で明るさを管理するすべての方法を次に示します。 Windows 11で明るさを変更する方法【10の方法を解説】 シングルモニターユーザーは、次の方法でWindows 11の明るさを調整できます。これには、ラップトップだけでなく、単一のモニターを使用するデスクトップ システムも含まれます。はじめましょう。方法 1: アクション センターを使用する アクション センターにアクセスできる

Windows のライセンス認証プロセスが突然切り替わり、このエラー コード 0xc004f069 を含むエラー メッセージが表示されることがあります。ライセンス認証プロセスはオンラインですが、Windows Server を実行している一部の古いシステムではこの問題が発生する可能性があります。これらの初期チェックを実行し、システムのアクティブ化に役に立たない場合は、問題を解決するための主要な解決策に進んでください。回避策 – エラー メッセージとアクティベーション ウィンドウを閉じます。次に、コンピュータを再起動します。 Windows ライセンス認証プロセスを最初から再試行します。解決策 1 – ターミナルからアクティブ化する cmd ターミナルから Windows Server Edition システムをアクティブ化します。ステージ – 1 Windows Server のバージョンを確認する 使用している W の種類を確認する必要があります
