ホームページ PHPフレームワーク ThinkPHP ThinkPHP6.0: イベントシステムとクエリイベントとモデルイベントの使用

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

Dec 16, 2019 pm 02:19 PM
イベントシステム モデルイベント

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

サーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項は何ですか? サーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項は何ですか? Mar 18, 2025 pm 04:54 PM

この記事では、パフォーマンスの最適化、ステートレス設計、セキュリティに焦点を当てたサーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項について説明します。コスト効率やスケーラビリティなどの利点を強調しますが、課題にも対処します

ThinkPhpの依存関係噴射コンテナの高度な機能は何ですか? ThinkPhpの依存関係噴射コンテナの高度な機能は何ですか? Mar 18, 2025 pm 04:50 PM

ThinkPHPのIOCコンテナは、PHPアプリで効率的な依存関係管理のための怠zyなロード、コンテキストバインディング、メソッドインジェクションなどの高度な機能を提供します。

ThinkPHPの組み込みテストフレームワークの主な機能は何ですか? ThinkPHPの組み込みテストフレームワークの主な機能は何ですか? Mar 18, 2025 pm 05:01 PM

この記事では、ThinkPHPの組み込みテストフレームワークについて説明し、ユニットや統合テストなどの主要な機能と、早期のバグ検出とコード品質の向上を通じてアプリケーションの信頼性を高める方法について強調しています。

ThinkPhpマイクロサービスでサービスの発見と負荷分散を実装する方法は? ThinkPhpマイクロサービスでサービスの発見と負荷分散を実装する方法は? Mar 18, 2025 pm 04:51 PM

この記事では、セットアップ、ベストプラクティス、統合方法、および推奨ツールに焦点を当てたThinkPhpマイクロサービスにサービスの発見と負荷分散の実装について説明します。[159文字]。

ThinkPhpとRabbitmqを使用して分散タスクキューシステムを構築する方法は? ThinkPhpとRabbitmqを使用して分散タスクキューシステムを構築する方法は? Mar 18, 2025 pm 04:45 PM

この記事では、ThinkPhpとRabbitMQを使用して分散タスクキューシステムの構築を概説し、インストール、構成、タスク管理、およびスケーラビリティに焦点を当てています。重要な問題には、Immedのような一般的な落とし穴を避けるための高可用性の確保が含まれます

ThinkPhpでファイルアップロードとクラウドストレージを処理する最良の方法は何ですか? ThinkPhpでファイルアップロードとクラウドストレージを処理する最良の方法は何ですか? Mar 17, 2025 pm 02:28 PM

この記事では、セキュリティ、効率、スケーラビリティに焦点を当てた、ファイルのアップロードとクラウドストレージをThinkPHPで統合するためのベストプラクティスについて説明します。

リアルタイムの株式市場データフィードを構築するためにThinkPhpを使用する方法は? リアルタイムの株式市場データフィードを構築するためにThinkPhpを使用する方法は? Mar 18, 2025 pm 04:57 PM

記事では、リアルタイムの株式市場データフィードにThinkPhpを使用して、セットアップ、データの正確性、最適化、セキュリティ対策に焦点を当てて説明します。

リアルタイムのコラボレーションツールを構築するためにThinkPhpを使用する方法は? リアルタイムのコラボレーションツールを構築するためにThinkPhpを使用する方法は? Mar 18, 2025 pm 04:49 PM

この記事では、ThinkPhpを使用してリアルタイムのコラボレーションツールを構築し、セットアップ、Websocket統合、セキュリティベストプラクティスに焦点を当てて説明します。

See all articles