最新バージョン 6.0 では、バージョン 5.1 の動作を置き換えるために新しいイベント システムが導入され、データベース イベントとモデル イベントも引き継がれました。
この記事では、主に新しいバージョンのイベント システムと、クエリ イベントとモデル イベントの使用方法について説明します。
イベントの定義
イベント システムのすべての操作は、think\facade\Event クラスを通じて静的に呼び出されます
Eventシステム オブザーバー パターンは、アプリケーションをより適切に分離する方法を提供するために使用されます。イベントをリッスンする必要がある場合は、次のコードを追加します:
Event::trigger('UserLogin');
またはヘルパー関数を使用します
event('UserLogin');
ここで、UserLogin はイベント識別子を表します。別のイベント クラスを定義する場合は、次のコードを使用できます。イベント クラス名、イベント クラス インスタンスを渡すこともできます。
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::bind('UserLogin', 'app\event\UserLogin');
にバインドすることも、アプリケーションのevent.phpイベント定義ファイルでバッチでバインドすることもできます。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], ];
イベントクラスを定義しない場合はバインドする必要はありません。
ThinkPHP のイベント システムはイベント クラスに依存しないため、追加の要件がない場合はイベントの識別を通じてのみ使用できます。
イベント メソッドでイベント パラメータを渡すことができます
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) { // 事件监听处理 } }
ハンドラメソッドで false が返された場合は、監視が終了したことを意味し、イベント以降の監視は実行されません。
通常は、対応するイベントの監視をイベント定義ファイルで直接定義することをお勧めします。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], ];
イベント サブスクリプション
イベント サブスクリプション メカニズムを使用して、1 つのリスナーで複数のイベントをリッスンできます。たとえば、コマンド ライン # を使用してイベント サブスクライバー クラスを生成します。 # #
php think make:subscribe User
<?php namespace app\subscribe; class User { public function onUserLogin($user) { // 事件响应处理 } public function onUserLogout($user) { // 事件响应处理 } }
Event::subscribe('app\subscribe\User');
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件监听 ], 'subscribe' => [ '\app\subscribe\User', // 更多事件订阅 ], ];
組み込みイベント
組み込みシステム イベントには次のものが含まれます。AppInit イベント定義はグローバル イベント定義ファイルで定義する必要があり、他のイベントはアプリケーションのイベント定義ファイルで定義できます。5.1 の元の動作タグの一部は廃止されており、キャンセルされたタグはすべてミドルウェアで置き換えることができます。ミドルウェアは、リクエストの処理と出力への応答に関連する特別なイベントと考えることができます。実際、ミドルウェアの handle メソッドには特別なパラメータと戻り値しかありません。
クエリ イベント
データベース操作のコールバックは、クエリ イベントとも呼ばれます。これは、データベースの CURD 操作用に設計されたコールバック メソッドです。主に次のものが含まれます。##次のメソッドを使用してデータベース クエリ イベントを登録します
\think\facade\Db::event('before_select', function ($query) { // 事件处理 return $result; });
同じクエリ イベントで複数の応答の実行を登録できます。新しいバージョンでは、クエリ イベントもイベント システムに引き継がれるため、before_select クエリ イベント リスナーを登録すると、最下層は実際に db.before_select として識別されるイベントのリスナーを登録します。
クエリ イベント メソッドのパラメータには、現在のクエリ オブジェクトというパラメータが 1 つだけあります。ただし、依存関係注入を通じてパラメータを追加することはできます。モデル イベント
モデル イベントとは、モデルのクエリと書き込み時にトリガーされる操作動作を指します。
モデル イベントは、モデル メソッドを呼び出した場合にのみ有効になり、クエリ コンストラクターの操作は無効です。#モデルは次のイベントをサポートします:
#登録されたコールバック メソッドは 1 つのパラメーター (現在のモデル オブジェクト インスタンス) の受け渡しをサポートしますが、パラメータを追加する依存関係注入方法。
before_write、before_insert、before_update、before_delete イベント メソッドが false を返すか、think\Exception\をスローする場合ModelEventException异常的话,则不会继续执行后续的操作。
模型事件定义
最简单的方式是在模型类里面定义静态方法来定义模型的相关事件响应。
<?php namespace app\index\model; use think\Model; use app\index\model\Profile; class User extends Model { public static function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public static function onAfterDelete($user) { Profile::destroy($user->id); } }
参数是当前的模型对象实例,支持使用依赖注入传入更多的参数。
模型事件观察者
如果希望模型的事件单独管理,可以给模型注册一个事件观察者,例如:
<?php namespace app\index\model; use think\Model; class User extends Model { protected $observerClass = 'app\index\observer\User'; }
User观察者类定义如下:
<?php namespace app\index\observer; use app\index\model\Profile; class User { public function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public function onAfterDelete($user) { Profile::destroy($user->id); } }
观察者类的事件响应方法的第一个参数就是模型对象实例,你依然可以通过依赖注入传入其它的对象参数。
PHP中文网,大量的免费ThinkPHP入门教程,欢迎在线学习!
本文转自:https://blog.thinkphp.cn/1037387
以上がThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。