ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP は URL ルーティングの詳細な分析を検出します

ThinkPHP は URL ルーティングの詳細な分析を検出します

咔咔
咔咔オリジナル
2020-12-01 12:09:462141ブラウズ

まえがき

記事が長くなってしまったので、別の記事に書きます。

前回の記事では以下の内容について説明させていただきました。

  • ルーティングの初期理解の簡単な分析
  • ルーティングを定義して外観について話しましょう
  • ルーティング定義 ルール メソッドの $this->group は具体的に何をするのですか?
  • ルーティング ルールの前処理
  • 解析および生成のための迅速なアクセスルーティング識別子

しかし、ルーティングについてはまだ説明すべきことがたくさんあります。次に、次の内容を分析します。

  • #ルーティング設定 (つまり、ルート ファイルの戻り値)
  • #ディスパッチの最初の概要
  • route-check は URL ルート
  • を検出します。 。 。 。 。 。 。 。 。 。 。 。 。
  • 以下、一つずつ詳しく説明していきます。

参考までに、ルーティングに関する実行図も示します。

ルート実行プロセスThinkPHP は URL ルーティングの詳細な分析を検出します

この部分の内容は実行アプリケーション内にあります。次に、Kaka が簡単に説明します。

このセクションにはソース コードの説明はありません。ソース コードは記事の残りの部分への道を整えるためにのみ使用されるため、ディスパッチとは何なのかを理解する必要があります。

次の図は、ルーティングの初期化後に上位層に戻って実行を継続するプロセスを示しています。

これでルート検出が実行されます。

ThinkPHP は URL ルーティングの詳細な分析を検出します
ディスパッチの最初の実行場所

ルーティング テストは次のように使用されます

ThinkPHP は URL ルーティングの詳細な分析を検出します
ルーティング テストの使用例

これで、このスケジュール情報を印刷できます

ThinkPHP は URL ルーティングの詳細な分析を検出します
データの印刷
ThinkPHP は URL ルーティングの詳細な分析を検出します#結果の印刷
上の図では、ディスパッチに関する関連する値が出力されています

#その後、

routeCheck

メソッドの簡単なプレビューが表示されます

routeCheckThinkPHP は URL ルーティングの詳細な分析を検出します
上記のメソッドでは、このステップでキャッシュが処理され、Dispatch オブジェクトが返されることを明確にします。

この部分のソース コードを見てみるだけでも構いません。それほど重要ではありません。

route-check URL ルーティングの検出

ただし、この部分の内容については、まだ簡単に確認する必要があります。

これを見る前に、渡される 2 つのパラメーターが何であるかを明確にする必要があります。

パラメータ 1: ルーティング ルール パラメータ 2: 必須ルーティングが設定されているかどうかを確認します。

ThinkPHP は URL ルーティングの詳細な分析を検出します#ディスパッチ オブジェクトを返します。
パラメータの意味を理解した後、チェック メソッドに進む必要があります。 。 探し出す。

ThinkPHP は URL ルーティングの詳細な分析を検出しますURL ルーティングの検出
この方法では、ドメイン名ルーティングの自動検出に関して、データがどのようなものかを出力してみましょう。

実際、返される結果は前のリソース ルーティング マウント方法と同じです。

ThinkPHP は URL ルーティングの詳細な分析を検出します結果を出力します
その後、 pathinfo 区切り文字が渡される: URL の / を |

に変更し、構成ファイルからルートを取得して完全に一致するかどうかを確認します。

最終実行にはデフォルト ルートを使用します

詳細はここで説明します。詳細な分析は省略します。ルーティングについては詳細が多すぎるため、1 つずつ詳細に注力すると、非常に時間がかかります。

したがって、このセクションの内容はここで終了します。最終的に何が実行され、何が返されるかを知る必要があるだけです。

2. リクエスト クラスの検索方法

前のセクションの

$result = $domain ->check($this->request, $url, $completeMatch); は、このブロックのコンテンツを実行します。

ここでは、このメソッドが何を実行するかは気にしません。

むしろ、$this->request が見つかって実行されるかどうかに注意する必要があります。

最初にわかるのは、request 属性が Route クラスに存在することです。

ThinkPHP は URL ルーティングの詳細な分析を検出します
リクエスト オブジェクトの属性

次に、Route のコンストラクターに進み、そこで新しい世界を見つけます。

ここでは配列のようにオブジェクトにアクセスするために ArrayAccess を使用していますが、 $app には request 属性が存在しないため、コンテナクラスの __get マジックメソッドが実行されます。 make メソッドの最初のパラメータは request であり、最終的に request のインスタンスが返されます。

ThinkPHP は URL ルーティングの詳細な分析を検出します
コンストラクター

ここでの $app は、実際には、依存関係注入を通じて取得される App インスタンスです。

これだけソースコードを読んだら、App クラスがコンテナ クラスである Container クラスを継承していることを知らなければなりません。

コンテナ クラスの下部にはいくつかのマジック メソッドがあります。

ここでは __get メソッドにのみ注意する必要があります。

ThinkPHP は URL ルーティングの詳細な分析を検出します#マジックメソッド
#__get メソッドは、存在しないプロパティにアクセスするときに実行される関数です。

つまり、最終的には make メソッドが実行されます。

ThinkPHP は URL ルーティングの詳細な分析を検出しますコンテナ クラスの make メソッド
このメソッドは一連の操作を経て、最終的に Request のインスタンスを返します。

そして、このインスタンスをコンテナーに保存すると、次回使用するときに直接取得できます。

コンテナクラスのmakeメソッドについてですが、コンテナクラスの中でも特に重要なメソッドであり、魂のメソッドでもあります。

フレームワーク全体のインスタンスはコンテナーを通じて返されるため、このメソッドの重要性についてはこれ以上説明する必要はありません。

Kaka はこれまでコンテナについて非常に深く理解しており、それを記事の形で皆さんに紹介しました。

#3. ドメイン名ルーティングの検出

#最初にプロセスを図示し、次にこれに従います。プロセスに合わせてステップ リズムをクリックするだけ。

ThinkPHP は URL ルーティングの詳細な分析を検出します
ルーティング ドメイン名検出のフローチャート

最初に確認するのは、実行中のアプリケーションでドメイン名のルーティング検出が行われていることです。

上位の実行プロセスにはエントリ ファイルがあります。

ThinkPHP は URL ルーティングの詳細な分析を検出します
アプリケーションの実行

まずコードが routeCheck メソッド内で実行され、次にこのファイルを確認します。

最初にコメントを見てください。このメソッドの説明は URL ルーティングの検出です。

この方法では、まずルーティング キャッシュが検出されます。このコンテンツはキャッシュに関するものです。

このメソッドで最も重要なことは、ルーティングの検出であり、Dispatch オブジェクトを返すことです。これがこのメソッドです。

ThinkPHP は URL ルーティングの詳細な分析を検出します
URL ルーティング検出

次のステップでは、この方法を見ていきます。

最初に明確にする必要があるのは、渡される 2 つのパラメーターが何であるかです。

  • $パス : string(4) "ブログ"
  • $must : bool(false)
ThinkPHP は URL ルーティングの詳細な分析を検出します
ルート検出

URL ルーティングを検出すると、次のことが行われます。

  • ##pathinfo 区切り文字: URL の / を |
  • ルートが完全に一致するかどうかを確認します
    # #ドメイン名ルーティングの検出
  • デフォルト ルート分析
  • 次のステップは、ドメイン名ルーティング プロセスの詳細な分析を実行することです。
最初の 2 つの実行は単なる文字列処理です。見てみれば、最終的に何が返されるかが分かります。

URL ルーティングの検出
ThinkPHP は URL ルーティングの詳細な分析を検出します
ドメイン名ルーティングの検出を実行する際の 3 つのパラメーターの意味も明確にします。

$this->request: コンテナ クラスの __get マジック メソッドを通じて、コンテナ クラスの make メソッドが実行され、最終的にリクエストのインスタンス オブジェクトが返されます。この列は読むことができません
    セクション 6 の記事
  • $url: string(4) "blog"
  • $ completeMatch: ルーティングが完了したかどうか Match
  • comes to
  • $result = $domain->check($this->request, $url, $completeMatch);
ここ、つまりこれがお祭りのポイントです。

この手法では、以下の処理が実行され、重要な実行処理が詳細に分析されます。

  • ルーティング エイリアスの検出: checkRouteAlias
  • URL バインディングの検出: checkUrlBind
  • ルーティング パラメーターの決定
  • ドメイン名ミドルウェアの追加
  • ##グループ ルーティングの検出:parent::check
ThinkPHP は URL ルーティングの詳細な分析を検出しますドメイン名ルーティングの検出

ルート エイリアスの検出: checkRouteAlias

パラメータの説明

  • $request: リクエスト クラスの例
  • $url: 渡されたブログ
この方法では、明確にする必要がある知識点が 2 つあります

  • strpos: 文字列内で最初に出現する位置を検索します。
  • strstr: strstr は、string1 内で string2 が最初に出現する位置を指すポインターを返します。strstr( "Helloworld!","world");?>\n出力:\nworld!
  • URL アドレスが最初に処理されます: ブログに戻る
  • エイリアス ルート定義 NULL を取得します。
  • リソース ルーティング ブログを例として、false を返します。
ThinkPHP は URL ルーティングの詳細な分析を検出しますルート エイリアスの検出
ルーティング エイリアスを検出するには、確認する必要があるメソッドがあります。

パラメータは、上の図で渡されたブログです

ThinkPHP は URL ルーティングの詳細な分析を検出します
エイリアス ルート定義の取得

このメソッドについて最初に明確にしておきたいのは、このメソッドがクラス thinkphp/library/think にあることです。 /Route.php

そして、このクラスは think\route

の下にあるすべてのクラスを使用します。このメソッドは、検出からルーティングされたブログを取得し、それを alias 属性から取得します。 Route class 、存在しない場合は NULL が返されます

このエイリアスの使用方法については後述します

ThinkPHP は URL ルーティングの詳細な分析を検出します
エイリアス ルート定義を取得します

Come エイリアス ルートの最後の部分を検出しますreturn $item? $item->check($request, $url): false;これがコード行です。上の図から、この項目は NULL

そして最終的にはこの NULL を返します。

#URL バインディングの検出: checkUrlBind

パラメータの説明

  • $request: リクエスト クラスのインスタンス
  • $url: 渡されたブログ
この方法では、以下の図の丸で囲った場所のみを詳しく説明します。

ThinkPHP は URL ルーティングの詳細な分析を検出しますURL バインディングの検出
メソッド

getBind ルート バインディングにアクセスすると、Kaka が渡されたことがわかります。パラメータが出力されます。 。

このメソッドは、クラス thinkphp/library/think/route/Domain.php にあります。このクラスは、$This->group でルーティング ルールを設定するときに使用されることに注意してください。わかりません。ルーティングの記事の最初のセクションを読むことができます。

同時に、このメソッドでは、subDomain 現在のサブドメイン名を取得します。

このメソッドは最終的に www を返します。主に最初の丸で囲まれた部分に注目してください。

リクエスト クラスのホスト メソッドを通じて現在のドメイン名を取得し、それを分割します。

戻りデータ: array(1) { [0] =>\n string(3) "www"\n}

サブドメイン名に値を割り当てます: $this-> ;subDomain

最終結果を返し、サブドメイン名を返します: www

ThinkPHP は URL ルーティングの詳細な分析を検出します
現在のサブドメイン名を取得します

その後、次の内容に戻ります。判断と取得が行われる上位層 WWW の現在のサブドメイン。

いくつかはすべて判定処理です。最初の判定は、www だけが返されるため、絶対に成立しません。

次の判定は、ルーティング バインディングに基づいています。知っておくだけで十分です。常に NULL が返されるということです。

ThinkPHP は URL ルーティングの詳細な分析を検出します
判定

最下層でNULLが返されることがわかっているので、ここでも判定が成立しないため、最終的な結果が返されます。上層 それは嘘です。

ThinkPHP は URL ルーティングの詳細な分析を検出します
URL バインディングの検出

ルーティング パラメーターの決定

上の図によると、実行プロセスは最終的に thinkphp/library/think/route/Domain.php に戻ります。このメソッド check はドメイン名のルーティングを検出します。

次に、ルーティング パラメータの判断を開始します。

ルーティングパラメータがない場合はスキップされ、実行されません。

ルーティングパラメーターが存在します: setRouteVars メソッドを実行: ルーティング変数を設定します。このパラメーターはフレームワークのバージョン 5.1.5 以降でのみ使用できます。Kaka が使用しているバージョンは少し低いため、説明は省略します詳細。

ThinkPHP は URL ルーティングの詳細な分析を検出します#ドメイン名ルーティングの検出
ThinkPHP は URL ルーティングの詳細な分析を検出しますドキュメント

ドメイン名ミドルウェアの追加

ミドルウェアについては、後ほど新しい記事で詳しく説明するのでここでは説明しませんが、今回は引き続きルーティングに焦点を当てます。

グループ ルーティングの検出

次に、ドメイン名ルーティングを検出する最後のプロセスに進み、コードを実行します

returnparent::check($request, $url , $completeMatch);

は、クラス

ファイル: thinkphp/library/think/route/RuleGroup.php にジャンプします。これは、Domain クラスが RuleGroup クラスを継承しているためです。

パラメータの説明

  • $request: リクエスト クラスのインスタンス
  • $url: 渡された blog
  • $completeMatch : ルートが完全に一致するかどうか

このメソッドでは、Kaka は、ここでのプロセスの 1 つ、つまりグループ化パラメータのマージについてのみ詳しく説明します。

このメソッドは実行プロセス全体の本線でもあり、残りは検出と判断のためのメソッドであるためです。

ThinkPHP は URL ルーティングの詳細な分析を検出します#グループ化パラメータのマージ

ルーティングについて 2 回の記事を費やしましたが、まだ終わっていません。長い間ソースコードを読んできた結果、ルーティングが最も複雑で理解しにくいです。

クラスは1つずつリンクされているので、ここで一旦ルーティングを理解して、後から他のソースコードを読んだときに他の内容を追加していきます。

主にルーティング記事で実行されるフローチャートをよく読む必要があります。

実行フローチャートThinkPHP は URL ルーティングの詳細な分析を検出します
ルーティングルールの登録時にグループ属性を通じて最終的に返されるのはDomainクラスであり、ここの内容は明確でなければなりません。

主に、ルーティングにおけるドメイン名の設定プロセスと、ドメイン名が設定されるタイミングについて知っています。

ルーティング ファイル内の戻り配列と、ルーティング ファイルをインポートするプロセスについて明確に理解しておく必要があります。

それでは、前に学習した ArrayAccess を復習して、配列などのオブジェクトにアクセスしてみましょう。

コンテナ内のマジック メソッド __get メソッド このマジック メソッドには、主にクラスのインスタンスを返し、それをコンテナに格納するために使用される make メソッドがあります。

今回はルーティング面についてですが、1回の記事で終わる予定です。

学習の継続、ブログの継続、共有の継続は、キャリア以来、カカが常に守ってきた信念です。Nuoda Internet でのカカの記事が少しでもお役に立てれば幸いです。少しお手伝いします。私はカカです。また次回お会いしましょう。

以上がThinkPHP は URL ルーティングの詳細な分析を検出しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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