ホームページ > PHPフレームワーク > ThinkPHP > ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します

咔咔
リリース: 2020-12-01 13:42:32
オリジナル
2050 人が閲覧しました
#“この記事ではルーティングのソースコードの解説が続きます。この記事をご覧になった方は、まず以前に書いたルーティングの記事、計2記事を読むことができます。

"

序文

最初の 2 つの記事のルーティング ソース コードを解釈した後, ルーティングについては皆さんよく理解していると思いますが、私もある程度理解しています。

この記事では、引き続き ThinkPHP ルーティング ソース コード分析について説明します。これでルーティング コンテンツも終わります。ルーティング スケジューリングに関する記事で終わります。皆さんがルーティングについてよく理解していただければ幸いです。バー!

ルーティングに関して、Kaka は、フレームワーク全体のソース コードを読み取る上で最も難しい核心点であり、多くの時間を費やしていると感じています。

入れ子のクラスがたくさんあるので、$this->group などの常識に従ってみてはいかがでしょうか。

これは単純な呼び出し関係ですが、ソース コードでは多くの関数が実行されます。

一般に、ソース コードはこのグループが単純なクラスであると認識します。実際にはそうではありません。返される最終結果は少し驚くべきものです。返されるのは Domain クラスです。

したがって、フレームワークに関するすべてを注意深く理解する必要があります。ソース コードを読むことは主に、フレームワークとフレームワークの設計思想についての理解を深めるために行われます。

手順に従ってみましょう。まずマイニング マシンの実行フローチャートを見てください。その後、フローチャートに基づいて記事を明確に読むことができます。

後期に読み込んだすべてのソースコードは、補足のためにここに直接追加されます。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します#フレームワーク実行プロセス

1. ルーティングマージグループ化パラメーターの検出、グループ化ルーティングの確認

前回の記事では、下の図の位置について説明しました。この位置は、当面はまだ空です。この空の位置は、次に説明するマージ グループ化パラメーターです。

パラメータのマージは、実際にはルーティング パラメータとデフォルト パラメータをマージすることです。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します実行場所
実行プロセスを明確に示すために、Kaka は実行プロセスを丸で囲みました。 ######実行可能ファイル:###
  1. thinkphp/library/think/App.php -> $dispatch = $this->route->check($path, $must);
  2. thinkphp/library/think/Route。 php -> $result = $domain->check($this->request, $url, $completeMatch);
  3. thinkphp/library/think /route/Domain.php -> $result = $this->checkRouteAlias($request, $url); -> returnparent::check($request, $url, $completeMatch);
  4. thinkphp/library/think/route/RuleGroup.php -> $this->mergeGroupOptions();

对应実行系:

  1. ルート検出は Dispatch オブジェクトを返します
  2. ドメイン名ルーティングの検出
  3. エイリアス ルーティングの検出->検出グループ化ルーティング
  4. グループ化パラメータのマージ
ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルート検出実行プロセス

次のことができます。これを参照してください。このセクションのタイトルは「ルーティング パラメータの検出とパケット ルーティングの確認」であるため、ルーティングの検出に関する内容はまだ多くあります。

Kaka は、グループ パラメーターのマージとグループ ルーティングのチェックにのみ焦点を当てているだけであり、最後に、その他の内容は行全体に浸透していないため、これについては詳しく説明しません。

次の記事ではコントローラーの一部について説明しますが、すべてを書くわけではありません。

グループ化パラメーターのマージ

まず、この部分の内容について説明します。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
グループ化パラメーターの結合

このコンテンツを確認する前に、$this->parent 属性を確認する必要があります。 「この値は何に設定されていますか?」を参照してください。

debug_backtrace() で出力すると、それが Domain のインスタンス化されたクラスであることがわかります。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
結果の印刷

次に、mergeGroupOptions メソッドの詳細な説明に進みます。

  • #実行ファイル: thinkphp/library/think/route/RuleGroup.php 164 行
  • ##$this->親: class think\route\ Domain
  • ルーティング パラメータの定義を取得します。ルーティング パラメータが存在しない場合は、「merge_rule_regex」 => bool(false) です。いずれにしても、ルーティング パラメータは最後に追加されます。
  • マージ グループ化パラメーター: $this->mergeOptions: 必要なルーティング パラメーター 'after'、'model'、'header'、'response'、'append'、'middleware'グループ化とマージします
  • array_merge を通じてパラメータをマージします
  • および lockOption パラメータをロックします
  • 最終的な戻り結果$this->option
  • 戻り結果は次の図に示されています

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します最終的な戻り結果

戻り結果ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
最終的には、ルーティング パラメータをマージします。公式にサポートされているルーティング パラメータについては、下の図を参照してください。お支払いください。サポートされているバージョン番号に注意してください。

通常の状況では、ルーティング パラメータは使用しません。ここでは、ルーティング パラメータが存在することを全員に知らせるためにのみ言及します。どうしても使用する場合は、必ずバージョン番号を明確に読んでください。そうしないと、A が発生します。たくさんのトラブル。

サポートされているルーティング パラメーターThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
グループ ルーティングの確認

ファイル: thinkphp/library/think/route/RuleGroup .php 183行目。

ここでは、まず変数 $rules の値が何であるかを明確にする必要があります。

グループ ルーティングの検出ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
$rules の値を出力すると、2 つの状況があることがわかります。

最初のケースはリソース ルーティングではありません。

2 番目のケースはリソース ルーティングです。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
$rules の値

これは、Kaka がルーティング ファイルに 2 つのルート (1 つのリソース ルートと 1 つの非リソース ルート) のみを設定しているためです。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルーティング設定ファイル

上図の丸で囲んだデータによると、$item の値が次の 2 つの状況に分かれていることがわかります。ループが実行されます。

  • think\route\Resource オブジェクトの check メソッドを実行します。
  • think\route\RuleItem を実行します。 Object の check メソッド

アーティファクトの印刷結果によると、リソースのルーティング時にも実行されることがわかりますthinkphp/library/think/route /RuleGroup.php クラスのチェックメソッド。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
Artifact Print

リソース ルーティングで thinkphp/library/think/route/RuleGroup.php

のチェックが実行される理由

Resource クラスは RuleGroup クラスを継承しているためです。

そして、$item の値は Resource クラスのインスタンスであるため、check メソッドが実行されます。

それでは、アーティファクトを持つことがいかに重要であるかということです。前の記事で、このアーティファクトの使用方法について詳しく説明しました。まだ使用方法がわからない、またはよくわからない場合は、使い方、ぜひチェックしてみてください!アーティファクトはコードの実行フローを直接出力できるため、ソース コードのデバッグ プロセスで非常に役立ちます。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
継承関係

checkメソッドを再度実行すると、次の図の丸で囲まれた最終結果が返されます。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルート グループ化の検出

非リソース ルーティング実行チェック

ファイル: thinkphp/library/think/ Route /RuleItem.php 行番号 231 非リソースルーティングを実行するメソッドです。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
非リソースルーティング実行メソッド

ルーティングルール検出メソッドを入力した後も、ルーティングパラメータはマージされます。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルーティングの検出

ルーティング パラメータを結合する方法については上で説明したので、ここでは詳しく説明しません。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
マージ ルーティング パラメータ

ここまでで、検出ルーティングでのグループ パラメータのマージとグループ ルーティングの確認についての説明を終了しました。 , マインドマップを見ることができます。

2. URL 変数とルール ルーティングが一致するかどうかを確認します。

次のケースでは、通常のルーティングが使用され、リソースは使用されません。ルーティングの場合、ファイル thinkphp/library/think/route/RuleItem.php

はアーティファクトを使用してデータを出力します。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します#実行プロセス
ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します実行プロセス
上記は実行プロセス全体であり、以下は続きます。 URL とルール ルーティングが一致するかどうかを確認するために解析する必要があるコンテンツです。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出しますURL とルール ルーティングが一致するかどうかを確認する
ここでコンテンツを開始する前に、Kaka に関する問題を解決しましょう。

上記のコードの上位層に移動し、返された結果を出力します。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
内容の印刷
ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
結果の印刷

次に、ルーティング構成ファイルroute.phpを見てみましょう。

このファイルでは、Kaka は 2 つのルーティング アドレスのみを構成し、そのうちの 1 つだけがリソース ルートであり、変数ルールが設定されています。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルーティング設定ファイル

このとき、ルーティング設定ファイルにルーティングアドレスを追加します。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルーティング構成ファイル

次に、記事の冒頭に結果を出力します。

なぜ false が返されるのかについて質問はありますか?

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
URL とルール ルートが一致するかどうかを確認し、結果を出力します。

URL とルール ルートが一致するかどうかを確認すると返される理由の解決策false

次に、ソースポイントに行って確認する必要があります。

このセクションの内容は上で説明されています。この項目には 2 つの状況があります。1 つ目は think\route\Resource Object の実行で、2 つ目は Execute think\route\RuleItem オブジェクト

はすべて check メソッドを実行します。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
実行プロセスのソースポイント

ファイルを実行する必要があることは明らかですthinkphp/library/think/route/ RuleItem.phpcheck が返されます。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ルーティングの検出

これら 2 行のコードに基づいて、$match 変数が関連している必要があることがわかります。

この変数は、URL とルール ルーティングが一致するかどうかを検出するために使用されます。これは最初に述べた内容に戻ります。

ソース コードは次のようになります。リンクごとにリンクしていきます。ゆっくり読んでください。さらに読むと理解できるようになります。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
コードに基づいて関係を見つけます

コードの解析を正式に開始します

パラメータの説明

  • $url: アクセス アドレス
  • $オプション: グループ化パラメータを結合
  • ##$completeMatch: ルートが完全に一致するかどうか一致
実行ファイル: ファイル: thinkphp/library/think/route/RuleItem.php

特定の実行のいくつかを詳しく見てみましょう。

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
解析されたソースコード

まず、ルートが完全に一致するかどうかの判定が行われますが、ルートを解釈する過程で、このような判定が多数出てきました。なぜ判断が必要なのかについては、別の記事で説明する予定です。

次に、ルーティング ルールをマージするコードが実行され、このプロセスによりルーティング ルールがマージされます。

getPattern メソッドに戻ります。ルーティング ルールが設定されていないため、直接戻ります。ルーティング ルールのこの変数の初期値は空の配列であるため、マージ後も空の配列のままです。

コードの 2 行目、具体的に何が実行されるかについて質問があるかどうかはわかりません。

依存関係の注入は、このクラスのコンストラクターで実行され、 // ルーティング インスタンス: think\Route が注入されます。

コードによる追跡は、構成情報から構成情報を取得することであり、返される結果は string(1) "/"

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します# になります。 ##ルーティング ルールをマージします
次にルーティング ルールを処理し、すべて | を /

ThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出しますルーティング ルールを処理します
によると、上の図で返された $rule について明確にできることの 1 つは、次の判定は実行されないということです。

#判定は実行されませんThinkPHP は URL 変数とルールルーティングが一致するかどうかを検出します
ここで知っておく必要があるメソッドの 1 つは preg_quote です。この関数は正規表現文字をエスケープするために使用されます

So 最後に、スラッシュ変数は

string(6) "\/\-\/"

として返されます。ここで、すべてのバックスラッシュはエスケープ文字です。 <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">preg_replace 関数は正規表現で文字列を区切ります。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">strncasecmp() 関数は 2 つの文字列を比較します (大文字と小文字は区別されません)。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">preg_match_all 関数は、グローバル正規表現マッチングを実行するために使用されます。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">preg_match_all 関数は、グローバル正規表現マッチングを実行するために使用されます。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">このメソッドには、ほとんどの人にはあまり馴染みのない関数がいくつかあります。情報は自分で確認するしかなく、Kaka はこれらのメソッドの使用法については説明しません。 </p> <h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; border-top: 2px solid rgb(248, 57, 41); text-align: center; font-size: 1.3em;"> <span class="prefix" style="display: none;"></span><span class="content" style="display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: #ffffff; padding: 3px 10px 1px; border-radius: 0 0 13px 13px;">概要</span><span class="suffix"></span> </h1> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">上記は、URL変数とルールルートが一致するかどうかを検出する内容です。このブロックの機能は次のとおりです。いくつかの側面について話しましょう。 </p> <ul data-tool="mdnice编辑器" style="margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: rgb(248, 57, 41);"> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">ルートが完全に一致するかどうかを確認するには、complete_match パラメータを使用します。 </section></li> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">マージ ルーティング ルール (パターンの使用)。 </section></li> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">最も重要なことは、次の部分がアドレスに対してさまざまな関数処理を実行することです。 </section></li> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">最終的な戻り値は、ルーティング パラメーターの配列の形式になります。 </section></li> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">上記はルーティングパラメータが存在する場合ですが、ルーティングパラメータが存在しない場合は、そのまま false を返します。 </section></li> <li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: rgb(53, 53, 53);">次に、戻って、ここで一致したルール ルーティングの解析を実行します。 </section></li> </ul> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"> ここではフローチャートを省略します。Kaka が提供するコード デバッグ ツールに従ってデバッグすることも、上記の Kaka が提供するガイドを参照することもできます。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">ルーティングがまもなく終了します。最後に残っている内容は、ルーティングのスケジューリング、ルーティングのスケジュール方法、最終的なルーティングの実行結果を誰に返すかです。これらはすべて面倒な質問です。次に、[Ka ] をクリックしてください。ルーティング スケジューリングの詳細な分析を提供します。 </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">この記事は、主にルーティング パラメータ、ルーティング変数、およびルールの検出に焦点を当てています。この内容は、以前の記事と合わせて読む必要があります。PHP 中国語 Web ページに連載記事があります。興味のある方は、返品可能です ぜひチェックしてみてください! </p> <blockquote class="multiquote-1" data-tool="mdnice编辑器" style="border: none; font-size: 0.9em; overflow: auto; margin-bottom: 20px; margin-top: 20px; padding: 15px 10px; line-height: 1.75; border-radius: 13px; color: rgb(53, 53, 53); background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"> <span style="display: block; font-size: 2em; color: rgb(248, 57, 41); font-family: Arial, serif; line-height: 1em; font-weight: 700;">「</span><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; font-size: 16px; margin: 0px 10px;">学習への粘り強さ、ブログへの粘り強さ、そして共有への粘り強さは、カカがそのキャリア以来、常に堅持してきた信念です。私は、カカの記事が巨大なインターネットに掲載されることを願っています」少しだけ持ってきてください。助けてください。私の名前はカカです。また次回お会いしましょう。</p> <span style="float: right; display: block; font-size: 2em; color: rgb(248, 57, 41); font-family: Arial, serif; line-height: 1em; font-weight: 700;">"</span> </blockquote>

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート