ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

咔咔
咔咔オリジナル
2020-12-29 11:14:331971ブラウズ

1. コントローラーでメソッドを実行します

#この記事のリクエスト アドレスは、設定されているドメイン名です。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

上記のことから、$instance の値が ## であることがわかります。 #app\ インデックスのインスタンス\controller\Index

これにもミドルウェアという概念がありますが、同様にミドルウェアについては次の記事で別途言及するため、ここでは説明しません。

Here

$this->app['middleware']->controllerこのコードを使用するとき、直接それが ArrayAccess なのか __get なのか覚えていますか?

ここでは、オブジェクトにアクセスするためにアクセス配列の形式を使用しているため、ArrayAccess の形式を使用しています。2 つの概念は明確に区別する必要があります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

次にメソッド名を取得しますが、メソッド名の取得方法はこのクラスのinitメソッド内で実行されます。ここでは、返される内容が index であることだけを知っておく必要があります。

ここで注意する必要があるのは、このコード行です。$this->rule->getConfig('action_suffix')、ここで取得されるのは操作メソッドのサフィックスです。 。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

この操作メソッドのサフィックスに値を設定するとどうなるでしょうか。

kaka 値を追加し、それにアクセスして結果を確認します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

今回アクセスすると、indexkakaのメソッドが存在しないと表示されますが、はっきりと見えますか? これは、このパラメータが追加されることを意味します。すべてのメソッド名。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

現在の操作名を取得するためのコードの展開が完了したら、次のステップは ## です。 #if (is_callable ([$instance, $action])) {

、ここに私たちの古い友人 is_callable が見えます。 ここでの is_callable の 2 つのパラメーターについては、上で説明したとおりです。最初のパラメーターは

app\index\controller\Index

のインスタンスで、2 番目のパラメーターは次のとおりです。 index操作メソッドを実行します。 <p data-tool="mdnice编辑器" style="margin-top: 0.8em; margin-bottom: 0.8em; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: padding-top: padding-bottom: line-height:>その後、<code style="font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba(27, 31, 35, 0.05); font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb>is_callable の役割は、app\index\controller\Index クラスの index メソッド名が実行可能かどうかを検出することです。

インデックス クラスにはインデックス メソッドがあるため、ここでは明らかに true が返されます。

テストを実行する前に、アプリ構成ファイルで構成したばかりのメソッド名のサフィックスをキャンセルする必要があります。

この is_callable により、3 つの状況が存在することが判断できます。次に、Kaka はそれを 3 つの側面から分析します。

最初の状況: クラスに実行可能メソッドがあります

  • 最初に ReflectionMethod クラスを返します
  • メソッド名のインデックスを取得します
  • メソッド名のサフィックスが の場合設定されていない場合は空を返します
  • 現在の操作名を設定します
  • この場合はパラメータが設定されていないため、最後の $vars は空の配列です。

このコードをパラメーターを使用してテストするには、ルーティング アドレスに少し変更を加える必要があります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ルートは以前に使用されていませんでしたが、デフォルトのアドレスが直接使用されました。このルートは、次のアドレスを使用します

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

このルーティング アドレスを使用してデータを印刷します。ルーティングパラメータを設定するのは私たちです。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

リクエスト変数を取得するこのメソッドは、$this->request->param();このコード行を入力します

フレームワークがパラメータを取得する方法

アクセス アドレス: http://www.source.com/index.php/hello/hello

at As we上記のとおり、パラメーターは $this->request->param() を通じて取得されます。では、フレームワークでパラメーターを取得するにはどうすればよいでしょうか?

処理コードによると、以下のようにコードが実行されます。取得したリクエストメソッドに応じて、対応するメソッドを使用してパラメータを取得します。ここで明確にする必要があるのは、get メソッドを使用していることです。リクエスト。

したがって、コードは $this->param まで実行されます。現在のリクエスト パラメーターと URL アドレス内のパラメーターがここにマージされます。ここで丸で囲まれた場所に注目してください。

Kaka はルーティングを使用して作成されたリクエストであるため、ここでのフレームワークはルーティング用のリクエスト パラメータを具体的にカプセル化します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

この route メソッドにアクセスすると、理解できるでしょう。これはルーティングパラメータを取得するために使用されますが、入力層に入る必要があります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

前のルーティングの記事では、ルーティング パラメータを取得するとパラメータがマージされます。リクエストのルート属性。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

したがって、$this->route は保存されたルートのすべてのパラメータです。ルーティングパラメータを含むルール。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

このとき、フィルタリングをサポートする変数とデフォルト値を取得するための実行処理が実行されます。 ##$this- >route

渡されたパラメータは false であるため、このブロックは直接返されます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

変数の取得はフィルタリングとデフォルト値をサポートします$vars

が取得されたルーティング パラメータです。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?#返されたルーティング パラメーターの結果

最初の判断が実行されると、 is_callable によってクラス内のメソッドが実行可能でないと判断され、2 番目の判断が実行されます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

まず、未設定のルーティング アドレスを要求し、何が返されるかを確認します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

コードによって示されるプロンプトに従って、インデックス コントローラーに移動して

を作成します。 _empty メソッドを使用してから、再度リクエストして、何が起こるかを確認してください。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

印刷結果を見ると、アクセスしたメソッドが存在しない場合、_empty メソッドが設定されることがわかります。実行されました。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

では、このメソッドはどのように実行されるのでしょうか?この実行方法はリフレクション メカニズムを使用して実現されており、リフレクション カカを説明する記事が以前に公開されましたが、ドキュメントを読んで表示する必要があります。

3 番目の状況: クラスに実行可能メソッドまたは _empty メソッドがありません。

この状況は比較的単純です。つまり、エラー メッセージが直接返され、ここでの例外処理についても後で説明します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

3 つの状況の実行後

3 つの状況の分析が完了すると、統計的手法が実行されます。最終的には実行されます。

リフレクション実行クラスの呼び出しメソッドはパラメータバインディングをサポートしています。つまり、ここでのクロージャ実行プロセスはここで完了します。

次の自動リクエストについては、セクション 5 で詳しく説明します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

2. ルーティング アドレスを使用してコントローラーをインスタンス化する方法

前項では、3~4期に渡ってルーティングについて説明してきましたが、最後はルーティングのスケジューリングについて説明しましたが、設定されたルーティングはどのように実行されるのでしょうか。

次はこのルートをケースとして使用します

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ルート検出開始時の戻り値を覚えておいてください?下の図を参照してください。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

当時は以下のコードの詳細な説明はなく、インスタンス化されたコントローラーについて直接説明されていましたが、今回話したいのは、現在のスケジューリング情報を記録する行です。コードの。

Here$this->request は、存在しないプロパティにアクセスするときにコンテナ クラスのマジック メソッドを実行するために使用され、最終的にコンテナを通じてインスタンスを返します。

したがって、コードは以下に示す位置まで実行され、現在のリクエストのスケジュール情報を設定または取得します

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

コントローラーをインスタンス化するときにここに出力すると、ここで返される値が index であることがわかります。この値はコントローラーに設定されます。コントローラーを使用して表示します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

init メソッドに移動し、ルーティング アドレスを使用して結果を印刷し、結果を表示します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ここの値がなぜ変更されたかわかりますか?

上に印刷された値は下の図ですが、なぜここでは上の図なのでしょうか。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ルーティング セクションの最後のステップでは、ルーティング スケジューリングを開始し、最後にモジュールへのルートを呼び出します。 / コントローラー/アクションのこのメソッド。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

このメソッドdispatchModule最後にクラスもインスタンス化します。次にクラスを作成する必要があります。さらなる研究

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?#

コード トレースによると、実際には think\route\dispatch\ModuleThis クラスであることがわかります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

クラス Module にアクセスすると、次のことがわかります。 Dispatch Class

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

の継承 thinkphp/library/think/ Route/Dispatch.phpthis クラスのコントローラーで、変数 dispatch が設定されていることがわかります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

今回を振り返ってみましょうモジュール/コントローラー/オペレーションへのルーティングここに渡されるメソッドパラメータは入力されていますか? (笑)

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

つまり、最終値は次のとおりです。単一の配列形式で出力されました。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

次のアクションは、ルーティング アクセスを使用しないプロセスと同じです。必要はありません。分析済み。

これでルーティング アドレスのインスタンス化方法は終了です。

$this->app->controller については、index が渡され、クラス名全体が返されます。具体的な実装プロセスは解析されません。実装メソッドは $this->parseModuleAndClass です。独自に調査することができます。

3. autoResponse スケジューリングの実行

セクション 4 では、実行コントローラー内のメソッドがその場所から実行されることについてのみ言及されています。下図では返品しましたが、返品方法については詳しく説明しておりません。

次に、実行方法について説明します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

アクセスルーティングアドレスは以下の通りで、返されたデータが必要なデータであることがわかります。コントローラに返されます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

印刷されたデータ値は次のとおりです。写真の場所。ここで明確にする必要があります。ソースコードを読むには少し調べる必要がありますが、時間が経つにつれて内容が理解できるようになります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

次のステップは $this->autoResponse($data);このメソッドは詳細な分析を実行します。このメソッドは文字通り自動的に応答します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

この実行プロセスの最初の行$data instanceof Response、これを理解していないと実行できません。それを読むために。

知らないこと、理解できないことは解決する必要があり、ソースコードを読んで少しずつ攻略してこそ勝てます。

instanceof の使用について

Instanceof は、オブジェクトが特定のクラスのインスタンスであるかどうか、およびオブジェクトが特定のインターフェイスを実装しているかどうかを判断できます。

次に、Kaka がこれを示す簡単な例を示します。そうすれば、何が起こっているのか理解できるでしょう。

ケース 1

まず、クラスを 2 つ作成します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

下の図は印刷結果で、1つ目はtrueを返し、2つ目はfalseを返すことがわかります。

オブジェクトが特定のクラスのインスタンスであるかどうかを判断します。つまり、$instance はクラス Test のインスタンスであるため、true を返します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ケース 2

ケース 2 はケース 1 とは異なります。この場合、インターフェイスが確立され、クラスがそのインターフェイスを実装します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

最終的な戻り結果はすべて true です。これは、クラスが別のインターフェイスを実装している場合、判定時に true になることを意味します。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

上記は、instanceof を理解するために与えられた 2 つのデモンストレーション ケースです。インスタンスが特定のクラスのインスタンスであるかどうかを判断することです。

次に、テキストに戻ります。$data instanceof Responseこのコード行は、渡されるデータがコントローラーによって返される値であるため、絶対に確立されません。

ということで、以下の位置までコード実行処理が実行されます is_null関数を使って判定します 判定は偽でなければなりませんので、以下のコードが実行されます。

このコードの最初の 2 つのポイントは解析されません。

最初の方法は、デフォルトで応答の出力タイプを自動的に識別することです。これは、それが Ajax リクエストであるかどうかを判断するためです。具体的な実装方法は、今回は Kaka がフレームワークのソース コードを解析するまで待機し、その後、しばらく時間がかかります毎日時間をかけてフレームワークのメソッドをいくつか学び、少し詳しく調べてみましょう。

2 番目の位置は、構成ファイルから対応する構成情報を取得することで、実行されるルール クラスのメソッドに注目しますが、メソッド内には構成情報を取得するために実行されるコードが含まれます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

次に、言及されていない 3 番目のステップを実行する必要があります。上記は解析されます。つまり、コード $response = Response::create($data, $type);

がクラス thinkphp/library/think/Response に追加されます。 .php メソッド create では、このメソッドは Response オブジェクトの作成に使用されます。

Kaka で囲んだ場所に注目してください。thinkphp/library/think/response ディレクトリには HTML がありません。

したがって、コードはこのクラスを直接インスタンス化してから戻ります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

このクラスのコンストラクターでは、主にいくつかのことを行います。

  • #戻り値をこのクラスのデータ属性に割り当てます
  • ページ出力タイプを設定します
  • ステータス コードを返します
  • アプリ インスタンス オブジェクトを設定します
  • ヘッダー情報

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

その後、コードは戻り値をこのメソッド

autoResponse## の $response 変数に割り当てます。 # 。 <p data-tool="mdnice编辑器" style="margin-top: 0.8em; margin-bottom: 0.8em; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: padding-top: padding-bottom: line-height:>最後に、この <code style="font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba(27, 31, 35, 0.05); font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb>$response が返され、返された情報は以下のように出力されます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?##返品情報を印刷

Kaka で囲まれた場所の次のコード行もミドルウェアに関するもので、最終的に返される結果が図に表示されている結果と同じであることだけを知っておく必要があります。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?ミドルウェア層に戻る

、ここから分析を開始します。

返された結果を $data に返し、それを実行しますreturn $this->autoResponse( $data );

お読みのとおり、ここのコードには見覚えがあるはずです。

今回返される結果は Response のインスタンスなので、$response が直接返されます。

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?

ここまでで、コントローラー内のメソッドが実行され、応答が解析されます。

設定したルーティングルールであっても、モジュールコントローラメソッドによる直接アクセスであっても、最終的には上記のメソッドで応答結果が返されます。

学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」少し持ってきてください助けてください。私はカカです。また今度。

以上がThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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