イベント
イベントを定義する方法は?
イベント システムのすべての操作は、think\facade\Event クラスを通じて静的に呼び出されます
イベント システムは、アプリケーションを分離するためのより良い方法を提供するために、オブザーバー パターン (PHP 設計パターンを参照してください) を使用します。
イベントをリッスンする必要がある場合、たとえば、ユーザーがログイン操作を完了した後に、次のイベント トリガー コードを追加します。
// 触发UserLogin事件 用于执行用户登录后的一系列操作 Event::trigger('UserLogin');
ここUserLogin はイベント ID を表します。別のイベント クラスを定義する場合は、イベント クラス名を使用できます (イベント クラス インスタンスを渡すこともできます)。
// 直接使用事件类触发 event('app\event\UserLogin');
イベント クラスは、コマンド ラインからすぐに生成できます。
php think make:event UserLogin
app\event\UserLogin イベント クラスがデフォルトで生成されます。または、生成する完全なクラス名を指定することもできます。
イベント クラスにメソッドを追加できます
namespace app\event; use app\model\User; class UserLogin { public $user; public function __construct(User $user) { $this->user = $user; } }
一般的なイベント クラスは他のクラスを継承する必要はありません。
イベント識別子をイベント クラスにバインドできます。通常は、アプリケーションのevent.phpイベント定義ファイルにバッチで直接バインドすることをお勧めします。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], ];
動的バインディングが必要な場合は、
Event::bind(['UserLogin' => 'app\event\UserLogin']);
ThinkPHP のイベント システムはイベント クラスに依存しません。追加の要件がない場合は、イベントの識別を通じてのみ使用できます。イベントを定義する必要性、クラスの問題。
イベントクラスを定義しない場合はバインドする必要はありません。ほとんどのシナリオでは、確かにイベント クラスを定義する必要はありません。
イベント メソッドでイベント パラメーターを渡すことができます
// user是当前登录用户对象实例 event('UserLogin', $user);
イベントをリッスン
イベント リスナーを手動で登録できます
Event::listen('UserLogin', function($user) { // });
または、リスニング クラスを使用してモニタリングを実行します
Event::listen('UserLogin', 'app\listener\UserLogin');
コマンド ラインからイベント リスニング クラスをすばやく生成できます
php think make:listener UserLogin
デフォルトでは、app\listener\UserLogin イベントリスニングクラスが生成されます。完全なクラス名の生成も指定できます。
イベント リスニング クラスは、ハンドル メソッドを定義するだけで済み、依存関係の注入をサポートします。
<?php namespace app\listener; class UserLogin { public function handle($user) { // 事件监听处理 } }
handleメソッドでfalseが返された場合は監視が終了したことを意味し、イベント以降の監視は実行されません。
通常は、対応するイベントの監視をイベント定義ファイルで直接定義することをお勧めします。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['app\listener\UserLogin'], // 更多事件监听 ], ];
イベント サブスクリプション
イベント サブスクリプション メカニズムを使用して、1 つのリスナーで複数のイベントをリッスンできます。たとえば、次のコマンドでイベント サブスクライバー クラスを生成します。 line ,
php think make:subscribe User
app\subscribe\User クラスがデフォルトで生成されますが、生成する完全なクラス名を指定することもできます。
その後、たとえば、イベント サブスクリプション クラスでさまざまなイベントのリスニング メソッドを追加できます。
<?php namespace app\subscribe; class User { public function onUserLogin($user) { // UserLogin事件响应处理 } public function onUserLogout($user) { // UserLogout事件响应处理 } }
イベントをリッスンするメソッドの命名規則はイベント識別子 (キャメル ケースの命名) に基づいており、イベント サブスクライバーをイベント定義ファイルに登録します。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['app\listener\UserLogin'], // 更多事件监听 ], 'subscribe' => [ 'app\subscribe\User', // 更多事件订阅 ], ];
イベント プレフィックス識別子を均一に追加したい場合は、eventPrefix 属性を定義できます。
<?php namespace app\subscribe; class User { protected $eventPrefix = 'User'; public function onLogin($user) { // UserLogin事件响应处理 } public function onLogout($user) { // UserLogout事件响应处理 } }
サブスクリプション メソッド (またはメソッド仕様) をカスタマイズする場合は、サブスクライブ メソッドの実装を定義できます。
<?php namespace app\subscribe; use think\Event; class User { public function onUserLogin($user) { // UserLogin事件响应处理 } public function onUserLogout($user) { // UserLogout事件响应处理 } public function subscribe(Event $event) { $event->listen('UserLogin', [$this,'onUserLogin']); $event->listen('UserLogout',[$this,'onUserLogout']); } }
動的に登録する必要がある場合は、
Event::subscribe('app\index\subscribe\User');
組み込みイベント
組み込みシステム イベントには次のものが含まれます:
説明 | パラメータ | |
---|---|---|
アプリケーション初期化タグ ビット | なし | |
アプリケーション開始タグ ビット | なし | #HttpEnd |
現在の応答オブジェクト インスタンス | LogWrite | |
現在書き込まれているログ情報 | #LogLevel | |
RouteLoaded | ルートの読み込みが完了しました | |
AppInit イベント定義はグローバルである必要があります イベント内で定義されています定義ファイルに加えて、アプリケーションのイベント定義ファイルで他のイベントを定義できます。 |
#データベース操作のコールバックは、クエリ イベントとも呼ばれます。これは、データベースの CURD 操作用に設計されたコールバック メソッドです。主に次のものが含まれます。
#イベント
before_select | |
---|---|
before_find
| find|
after_insert ##insert | 操作成功後のコールバック|
after_update | update | 操作成功後のコールバック
#after_delete | #delete操作成功後のコールバック |
モデル イベントには次のものが含まれます: |
|
対応する操作
#after_read
before_insert | 新規追加前 |
---|---|
新規追加後 | |
更新前 | |
更新後 | |
書き込み前 | |
書き込み後 | |
#削除前 | ##after_delete |