ThinkPHP6 アーキテクチャ構造


エントリ ファイル (index.php)

ユーザーによって要求された、リクエストの処理を担当する PHP ファイル (必ずしもURL リクエスト) ライフ サイクルでは、エントリ ファイルはパブリック ディレクトリの下にあります。最も一般的なエントリ ファイルは、index.php です。6.0 では、複数のアプリケーション エントリがサポートされています。個別のエントリ ファイル admin.php など、アプリケーションごとにエントリ ファイルを追加できます。バックグラウンドアプリケーション用。

自動マルチアプリケーションがオンになっている場合、通常、必要なエントリ ファイルは 1 つだけ、index.php です。

Application(application>

は複数のアプリケーションをサポートします。各アプリケーションはアプリ ディレクトリのサブディレクトリです。各アプリケーションには独立したルーティングと構成があります。また、コントローラーやモデルなどの MVC 関連ファイル、これらのアプリケーションはフレームワーク コアと拡張機能を共有でき、コンポーザー アプリケーションの読み込みをサポートできます。 #ThinkPHP は、(オブジェクト) コンテナーを使用して、オブジェクト インスタンスと依存関係の注入を均一に管理します。

コンテナー クラスの作業は think\Container クラスによって完了しますが、ほとんどの場合、アプリケーション クラス (think\App) を使用します。 class) または コンテナ操作を完了するためのアプリ ヘルパー関数です。コンテナ内のすべてのオブジェクト インスタンスは、コンテナ識別子シングルトンを介して呼び出すことができます。オブジェクト識別子をコンテナ内のオブジェクト インスタンスにバインドできます。バインディングがない場合は、
システム サービス

システム サービスの概念は、特定のコンポーネントやコンポーネントを実行するときに依存する必要があるいくつかの基本的なサービスを指します。フレームワークの機能。サービス クラスは通常、システムの think\Service クラスから継承できますが、必須ではありません。

システム サービス内のオブジェクトをコンテナに登録したり、特定のサービスに対して関連する依存関係の注入を実行したりできます。システム サービスの実行優先順位により、実行中に関連するコンポーネントが関連する依存関係の挿入を完了していることを確認できます。ルートは計画に使用されます (通常は同時に簡略化されます) 要求されたアクセス アドレス、ルーティング ルールを確立します => アクセス アドレスと実際の操作方法の間のマッピング関係

ThinkPHP はルーティングの使用を強制されませんルーティングが定義されていない場合は、それを直接使用できます。「コントローラ/オペレーション」メソッド。ルートが定義されている場合、そのルートに対応するルーティング アドレスに直接アクセスすることはできません。必須のルーティング パラメータをオンにすると、ルートは

ルーティングを使用すると、ある程度のパフォーマンスの低下がありますが、各ルートには独自の有効性条件があるため、より安全です。リクエストが条件を満たさない場合、フィルタリングされます。コントローラーの操作に関しては、あなたの方がはるかに優れています。さまざまな判断を下す方がはるかに実用的です。

実際、ルーティングの役割は、URL の指定ほど単純ではありません。また、検証、権限、パラメータ バインディング、応答設定などの機能も実装できます。

Controller
各アプリケーションには、独立したクラス ライブラリと構成ファイルがあります。リクエストへの応答を担当するアプリケーションの下にある複数のコントローラーであり、各コントローラーは実際には独立したコントローラー クラスです。

コントローラーは主に、リクエストの受信、関連するモデル処理の呼び出し、そして最終的にビューを介した出力を担当します。厳密に言えば、コントローラーはビジネス ロジックの処理にあまり関与すべきではありません。

実際には、コントローラーをスキップすることができ、ルーティングを通じてリクエストをモデルまたは他のクラスに直接ディスパッチして処理することができます。

ThinkPHP のコントローラー クラスは比較的柔軟で、基本的なクラス ライブラリを継承する必要がありません。

典型的なインデックス コントローラー クラス (シングル アプリケーション モード) は次のとおりです。

<?php
namespace app\controller;

class Index 
{
    public function index()
    {
        return 'hello,thinkphp!';
    }
}

一般に、拡張を容易にするために基本コントローラーを継承することをお勧めします。システムは、デフォルトで app\BaseController コントローラー クラスを提供します。

操作(アクション)

コントローラーには複数の操作(メソッド)が含まれており、操作メソッドはURLアクセスの最小単位です。

次は、2 つの操作メソッドを含む一般的なインデックス コントローラー操作メソッドの定義です:

<?php
namespace app\controller;

class Index 
{
    public function index()
    {
        return 'index';
    }
    
    public function hello(string $name)
    {
        return 'Hello,'.$name;
    }
}

操作メソッドではパラメーターを使用できません。オプションではないパラメーターが定義されている場合、および ifオブジェクト タイプではないため、パラメータはユーザー リクエストを通じて渡される必要があります。URL リクエストの場合は、通常、現在のリクエストを通じて渡されます。操作メソッドのパラメータは依存関係の注入をサポートしています。

Model

モデル クラスは通常、実際のビジネス ロジックとデータのカプセル化を完了し、形式に関係なくデータを返します。

モデル クラスは必ずしもデータベースにアクセスする必要はありません。ThinkPHP のアーキテクチャ設計では、データベース接続は実際のデータベース クエリ操作が実行されるときにのみ行われます。これは真の遅延接続です。

ThinkPHP のモデル層は多層設計に対応しており、モデル層を論理層/サービス層/イベント層に分割するなど、モデル層をより詳細に設計・分業することができます。

モデル クラスは通常、think\Model クラスを継承する必要があります。典型的なユーザー モデラー クラスは次のとおりです:

<?php
namespace app\model;

use think\Model;

class User extends Model
{
}

View(view)

コントローラーがモデル クラスを呼び出した後、返されたデータはビューを通じてさまざまな形式の出力に組み立てられます。ビューは、テンプレート エンジンを呼び出してコンテンツを解析して出力するか、さまざまなニーズに応じて直接出力するかを決定します。

テンプレート エンジン (テンプレート)

いくつかの特別なテンプレート タグをテンプレート ファイルで使用でき、これらのタグの解析は通常、テンプレート エンジンによって実装されます。 。

新しいバージョンには、組み込みの think-template テンプレート エンジンがなくなりました。ThinkPHP 公式テンプレート エンジンを使用する必要がある場合は、think-view テンプレート エンジン ドライバー拡張機能を別途インストールする必要があります。

ドライブ

システムの多くのコンポーネントは、より柔軟に拡張できるドライバー設計を採用しており、ドライバー クラスの場所は、デフォルトでコア クラス ライブラリに配置されていますこのディレクトリでは、ドライバー クラス ライブラリの名前空間を再定義し、ドライバーのファイルの場所を変更することもできます。

ドライバーの 6.0 バージョンは、Composer を使用してインストールおよび管理されます。

ミドルウェア

ミドルウェアは、主にアプリケーションの HTTP リクエストをインターセプトまたはフィルタリングし、必要なビジネス処理を実行するために使用されます。

新バージョンの一部のコア機能はミドルウェアによって処理されており、柔軟に無効にすることができます。セッション機能、ページトレース機能、リクエストキャッシュ、多言語機能を含みます。 #########イベント#########

6.0では、従来の動作やフック機構をイベント機構に置き換えており、アプリケーション内でイベント機構の機能を利用して機能を拡張することができます。

さらに、データ操作を完了するためのデータベース操作とモデル操作のコールバック メカニズムでもイベント メカニズムが使用されます。

ヘルパー関数 (ヘルパー)

システムは、いくつかの一般的な操作に対してヘルパー関数のサポートを提供しますが、コア フレームワーク自体はヘルパー関数に依存しません。アシスタント機能の使用はパフォーマンスには直接影響しませんが、IDE からの自動リマインダーの利便性を享受できない場合があります。ただし、アシスタント機能を使用するかどうかはプロジェクトの仕様に依存します。また、システムが提供するアシスタント機能を書き換えることもできます。アプリケーションの公開関数ファイル。




#