ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用

爱喝马黛茶的安东尼
リリース: 2019-12-16 14:19:15
転載
5462 人が閲覧しました

ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用

最新バージョン 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 [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
];
ログイン後にコピー

イベント サブスクリプション

イベント サブスクリプション メカニズムを使用して、1 つのリスナーで複数のイベントをリッスンできます。たとえば、コマンド ライン # を使用してイベント サブスクライバー クラスを生成します。 # #

php think make:subscribe User
ログイン後にコピー

app\subscribe\User クラスはデフォルトで生成されますが、生成する完全なクラス名を指定することもできます。

その後、イベント サブスクリプション クラスにさまざまなイベントのリスニング メソッドを追加できます。次に例を示します。

<?php
namespace app\subscribe;
class User
{
    public function onUserLogin($user)
    {
        // 事件响应处理
    }
    public function onUserLogout($user)
    {
        // 事件响应处理
    }
}
ログイン後にコピー

リスニング イベント メソッドの命名規則は、イベントの識別 (キャメル ケースの命名) に基づいています。イベント サブスクリプションを登録します

Event::subscribe(&#39;app\subscribe\User&#39;);
ログイン後にコピー

通常は、イベント定義ファイルで直接定義することをお勧めします

return [
    &#39;bind&#39;    =>    [
        &#39;UserLogin&#39; => &#39;app\event\UserLogin&#39;,
        // 更多事件绑定
    ],
    &#39;listen&#39;  =>    [
        &#39;UserLogin&#39;    =>    [&#39;\app\listener\UserLogin&#39;],
        // 更多事件监听
    ],
    &#39;subscribe&#39;    =>    [
       &#39;\app\subscribe\User&#39;,
        // 更多事件订阅
    ],
];
ログイン後にコピー

組み込みイベント

組み込みシステム イベントには次のものが含まれます。

ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用

AppInit イベント定義はグローバル イベント定義ファイルで定義する必要があり、他のイベントはアプリケーションのイベント定義ファイルで定義できます。

5.1 の元の動作タグの一部は廃止されており、キャンセルされたタグはすべてミドルウェアで置き換えることができます。ミドルウェアは、リクエストの処理と出力への応答に関連する特別なイベントと考えることができます。実際、ミドルウェアの handle メソッドには特別なパラメータと戻り値しかありません。

クエリ イベント

データベース操作のコールバックは、クエリ イベントとも呼ばれます。これは、データベースの CURD 操作用に設計されたコールバック メソッドです。主に次のものが含まれます。

ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用##次のメソッドを使用してデータベース クエリ イベントを登録します

\think\facade\Db::event(&#39;before_select&#39;, function ($query) {
    // 事件处理
    return $result;
});
ログイン後にコピー

同じクエリ イベントで複数の応答の実行を登録できます。新しいバージョンでは、クエリ イベントもイベント システムに引き継がれるため、before_select クエリ イベント リスナーを登録すると、最下層は実際に db.before_select として識別されるイベントのリスナーを登録します。

クエリ イベント メソッドのパラメータには、現在のクエリ オブジェクトというパラメータが 1 つだけあります。ただし、依存関係注入を通じてパラメータを追加することはできます。

モデル イベント

モデル イベントとは、モデルのクエリと書き込み時にトリガーされる操作動作を指します。

モデル イベントは、モデル メソッドを呼び出した場合にのみ有効になり、クエリ コンストラクターの操作は無効です。

#モデルは次のイベントをサポートします:

ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用#登録されたコールバック メソッドは 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 (&#39;thinkphp&#39; == $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 = &#39;app\index\observer\User&#39;;
}
ログイン後にコピー

User观察者类定义如下:

<?php
namespace app\index\observer;
use app\index\model\Profile;
class User
{
    public function onBeforeUpdate($user)
    {
    if (&#39;thinkphp&#39; == $user->name) {
        return false;
        }
    }
    
    public function onAfterDelete($user)
    {
Profile::destroy($user->id);
    }
}
ログイン後にコピー

观察者类的事件响应方法的第一个参数就是模型对象实例,你依然可以通过依赖注入传入其它的对象参数。

PHP中文网,大量的免费ThinkPHP入门教程,欢迎在线学习!

本文转自:https://blog.thinkphp.cn/1037387

以上がThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:thinkphp.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!