この記事では、PHP の Yii フレームワークの動作メカニズムとルーティング機能を主に紹介します。 Yii は、大規模な Web サイトの開発に適したコンポーネントベースの重量級の PHP フレームワークです。困っている友達は参考にしてください。お役に立てれば幸いです。
動作メカニズムの概要
Yii アプリケーションは HTTP リクエストの処理を開始するたびに、おおよそのプロセスを経ます。
ユーザーはエントリ スクリプト web/index.php にリクエストを送信します。
エントリ スクリプトは構成配列をロードし、リクエストを処理するアプリケーション インスタンスを作成します。
アプリケーションは、リクエスト アプリケーション コンポーネントを通じてリクエストされたルートを解析します。
アプリケーションは、リクエストを具体的に処理するコントローラー インスタンスを作成します。
コントローラーはアクション インスタンスを作成し、アクションに関連するフィルター (アクセス フィルター) を実行します。
いずれかのフィルターが検証に失敗した場合、アクションはキャンセルされます。
すべてのフィルターに合格すると、アクションが実行されます。
アクションは、通常はデータベースからデータ モデルを読み込みます。
アクションはビューをレンダリングし、必要なデータ モデルをビューに提供します。
レンダリングされた結果は、応答アプリケーションコンポーネントに返されます。
レスポンシブコンポーネントは、レンダリング結果をユーザーのブラウザに送り返します。
以下の図は、アプリケーションがリクエストをどのように処理するかを示しています。
ブートストラップ
ブートストラップとは、アプリケーションが新しく受け入れられたリクエストの解析と処理を開始する前に、事前に環境を準備するプロセスを指します。起動ガイダンスはエントリースクリプト(Entry Script)とアプリケーション本体(application)の2箇所で行われます。
エントリースクリプトでは、各クラスライブラリのクラスファイルオートローダー(Class Autoloader、以下オートローダー)を登録する必要があります。これには主に、autoload.php ファイル経由でロードされる Composer オートローダーと、Yii クラス経由でロードされる Yii オートローダーが含まれます。次に、エントリ スクリプトはアプリケーションの構成を読み込み、アプリケーション プリンシパルのインスタンスを作成します。
アプリケーション本体のコンストラクターでは、次のガイダンス作業が実行されます:
yiibaseApplication::preInit() (初期化前) メソッドを呼び出して、yiibaseApplication などの優先度の高いアプリケーション属性を構成します。 :basePath 属性。
yiibaseApplication::errorHandler を登録します。
指定されたアプリケーション構成を通じてアプリケーションのプロパティを初期化します。
yiibaseApplication::init() (初期化) メソッドを呼び出すと、yiibaseApplication::bootstrap() が順番に呼び出され、ブートストラップ コンポーネントが実行されます。
拡張機能マニフェストファイルvendor/yiisoft/extensions.phpをロードします。
各拡張機能で宣言されたブートストラップ コンポーネントを作成して実行します。
アプリケーションの Bootstrap 属性で宣言された各アプリケーション コンポーネントと各モジュール コンポーネント (存在する場合) を作成して実行します。
ブートストラップ作業は各リクエストを処理する前に実行する必要があるため、このプロセスを可能な限り軽量にすることが非常に重要です。このステップを可能な限り最適化してください。
ブートコンポーネントを登録しすぎないように注意してください。 HTTP リクエスト処理のライフサイクル全体を通じて機能する必要がある場合にのみ使用する必要があります。その使用例を挙げると、モジュールで追加の URL 解析ルールを登録する必要がある場合は、リクエストを解析する前に URL 解析ルールが有効になるように、アプリケーションのブートストラップ属性にそのルールを登録する必要があります。 (注釈: つまり、パフォーマンスのニーズのために、URL 解析などのいくつかの操作を除いて、ほとんどのコンポーネントはブート プロセス中にすべてではなくオンデマンドでロードされる必要があります。)
運用環境では、バイトコードのキャッシュをオンにすることができます。 、APC などを使用して、PHP ファイルのロードと解析に必要な時間をさらに最小限に抑えます。
一部の大規模なアプリケーションには、非常に複雑なアプリケーション構成が含まれており、多くの小さな構成ファイルに分割されています。この時点で、エントリ スクリプトがアプリケーション インスタンスを作成する前に、構成配列全体をキャッシュし、キャッシュから直接ロードすることを検討できます。
yii のエントリーファイル
ここでは、Yii の設定を管理するためにサードパーティの設定管理プラグインが使用されています。詳細については説明しません。残っているのは、基本的なグローバル変数の設定だけです。設定配列を Yii::createWebApplication に渡し、run メソッドを呼び出します。Web アプリケーションは実行中ですか? はい、最上位レベルの抽象化は次のようになります。対応する設定をコンテナに渡すと、アプリケーションが実行できるようになります。通常はこの構成に基づいています。
YiiBase の 2 つの重要なメソッド (インポート、オートロード) について話しましょう
ここではサードパーティの設定管理プラグインが使用されています: marcovwout は Yii 設定を管理します。詳細については説明しません。残っているのは、基本的なグローバル変数の設定だけです。設定配列を Yii::createWebApplication に渡し、run メソッドを呼び出します。Web アプリケーションは実行中ですか? はい、最上位レベルの抽象化は次のようになります。対応する設定をコンテナに渡すと、アプリケーションが実行できるようになります。通常はこの構成に基づいています。
ルーティング
エントリ スクリプトが yiiwebApplication::run() メソッドを呼び出すと、実行される最初の操作は入力リクエストを解析し、次にリクエストを処理するために対応するコントローラー操作をインスタンス化することです。このプロセスはルーティングと呼ばれます。 (注釈: 中国語では動詞と名詞の両方です)
ルーティングを解決する
ルーティング ガイダンスの最初のステップは、受信リクエストをルートに解析することです。 「コントローラー」の章で説明したように、ルートはコントローラーのアクションを見つけるために使用されるアドレスです。このプロセスは、リクエスト アプリケーション コンポーネントの yiiwebRequest::resolve() メソッドを通じて実装され、URL マネージャーを呼び出して実際のリクエスト解決を実行します。
デフォルトでは、受信リクエストには r という名前の GET パラメータが含まれ、その値はルートとして扱われます。ただし、yiiwebUrlManager::enablePrettyUrl を有効にすると、リクエストのルートを決定するときにさらに多くの処理が発生します。具体的な詳細については、URL の解析と生成の章を参照してください。
最終的にルートを決定できない場合、リクエストコンポーネントは yiiwebNotFoundHttpException 例外 (注釈: 有名な 404) をスローします。
デフォルトルート
受信リクエストが特定のルートを提供しない場合 (通常、これは主にホームページに対するリクエストです)、 yiiwebApplication::defaultRoute 属性で指定されたデフォルトのルーティングが有効になります。このプロパティのデフォルト値は site/index で、サイト コントローラーのインデックス アクションを指します。このプロパティの値は、アプリケーション構成で次のように調整できます:
return [ // ... 'defaultRoute' => 'main/index', ];
catchAll ルーティング (完全なインターセプト ルーティング)
場合によっては、Web アプリケーションを一時的にメンテナンス モード、すべてのリクエストに調整する必要がある場合があります。 同じ情報ページと表示されます。もちろん、これを達成する方法はたくさんあります。ここでの最も簡単かつ最速の方法は、アプリケーション設定で yiiwebApplication::catchAll 属性を設定することです。
return [ // ... 'catchAll' => ['site/offline'], ];
catchAll 属性は、配列でパラメーターとして渡す必要があります。配列の最初の要素はルートであり、残りの要素はルートです。 (名前と値のペアを使用して) 操作にバインドされた個々のパラメーターを指定します。
catchAll 属性が設定されている場合、受信リクエストから解析されたすべてのルートが置き換えられます。この設定では、すべての受信リクエストの処理に使用されるアクションは同じサイト/オフラインになります。
アクションの作成
リクエストルートが決定したら、次のステップはルートに応答する「アクション」オブジェクトを作成することです。
ルートは、内部のスラッシュを使用して複数のコンポーネント フラグメントに分割できます。たとえば、サイト/インデックスはサイトとインデックスの 2 つの部分に分解できます。各フラグメントは、モジュール、コントローラー、またはアクションを指す ID です。
ルートの最初のフラグメントから開始して、アプリケーションは次のプロセスを実行して、モジュール (存在する場合)、コントローラー、およびオペレーションを作成します:
アプリケーション本体を現在のモジュールとして設定します。
現在のモジュールの yiibaseModule::controllerMap に現在の ID が含まれているかどうかを確認します。その場合、テーブル内の設定に基づいてコントローラー オブジェクトが作成され、ステップ 5 に進んでルートの後続のフラグメントを実行します。
現在のモジュールの yiibaseModule::modules 属性のモジュール リスト内のモジュールを ID が指しているかどうかを確認します。その場合、モジュール テーブルの構成に基づいてモジュール オブジェクトが作成され、新しく作成されたモジュールが環境として使用され、ステップ 2 に戻って次のルートを解析します。
この ID をコントローラー ID として扱い、コントローラー オブジェクトを作成します。次の手順を使用して、ルート内の残りのフラグメントを解析します。
コントローラーは yiibaseController::actions() で現在の ID を検索します。見つかった場合は、マッピング テーブル内の構成に基づいてアクション オブジェクトを作成します。それ以外の場合、コントローラーは、ID に対応し、アクション メソッドによって定義されたインライン アクションを作成しようとします。
上記の手順でエラーが発生した場合、yiiwebNotFoundHttpExceptionがスローされ、ルート案内処理が失敗したことを示します。
関連する推奨事項:
以上がYii の動作メカニズムとルーティングの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。