ホームページ > 記事 > PHPフレームワーク > ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
#この記事のリクエスト アドレスは、設定されているドメイン名です。
上記のことから、$instance
の値が ## であることがわかります。 #app\ インデックスのインスタンス\controller\Index。
$this->app['middleware']->controllerこのコードを使用するとき、直接それが ArrayAccess なのか __get なのか覚えていますか?
次にメソッド名を取得しますが、メソッド名の取得方法はこのクラスのinitメソッド内で実行されます。ここでは、返される内容が index
であることだけを知っておく必要があります。
ここで注意する必要があるのは、このコード行です。$this->rule->getConfig('action_suffix')
、ここで取得されるのは操作メソッドのサフィックスです。 。
この操作メソッドのサフィックスに値を設定するとどうなるでしょうか。
kaka 値を追加し、それにアクセスして結果を確認します。
今回アクセスすると、indexkakaのメソッドが存在しないと表示されますが、はっきりと見えますか? これは、このパラメータが追加されることを意味します。すべてのメソッド名。
現在の操作名を取得するためのコードの展開が完了したら、次のステップは ## です。 #if (is_callable ([$instance, $action])) {、ここに私たちの古い友人 is_callable
が見えます。 ここでの is_callable の 2 つのパラメーターについては、上で説明したとおりです。最初のパラメーターは
のインスタンスで、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 つの側面から分析します。
最初の状況: クラスに実行可能メソッドがあります
$vars
は空の配列です。 このコードをパラメーターを使用してテストするには、ルーティング アドレスに少し変更を加える必要があります。
ルートは以前に使用されていませんでしたが、デフォルトのアドレスが直接使用されました。このルートは、次のアドレスを使用します
このルーティング アドレスを使用してデータを印刷します。ルーティングパラメータを設定するのは私たちです。
リクエスト変数を取得するこのメソッドは、$this->request->param();
このコード行を入力します
フレームワークがパラメータを取得する方法
アクセス アドレス: http://www.source.com/index.php/hello/hello
at As we上記のとおり、パラメーターは $this->request->param()
を通じて取得されます。では、フレームワークでパラメーターを取得するにはどうすればよいでしょうか?
処理コードによると、以下のようにコードが実行されます。取得したリクエストメソッドに応じて、対応するメソッドを使用してパラメータを取得します。ここで明確にする必要があるのは、get メソッドを使用していることです。リクエスト。
したがって、コードは $this->param
まで実行されます。現在のリクエスト パラメーターと URL アドレス内のパラメーターがここにマージされます。ここで丸で囲まれた場所に注目してください。
Kaka はルーティングを使用して作成されたリクエストであるため、ここでのフレームワークはルーティング用のリクエスト パラメータを具体的にカプセル化します。
この route
メソッドにアクセスすると、理解できるでしょう。これはルーティングパラメータを取得するために使用されますが、入力層に入る必要があります。
前のルーティングの記事では、ルーティング パラメータを取得するとパラメータがマージされます。リクエストのルート属性。
したがって、$this->route
は保存されたルートのすべてのパラメータです。ルーティングパラメータを含むルール。
渡されたパラメータは false であるため、このブロックは直接返されます。
が取得されたルーティング パラメータです。
#返されたルーティング パラメーターの結果
最初の判断が実行されると、 is_callable
によってクラス内のメソッドが実行可能でないと判断され、2 番目の判断が実行されます。
を作成します。 _empty メソッドを使用してから、再度リクエストして、何が起こるかを確認してください。
印刷結果を見ると、アクセスしたメソッドが存在しない場合、_empty
メソッドが設定されることがわかります。実行されました。
3 番目の状況: クラスに実行可能メソッドまたは _empty メソッドがありません。
この状況は比較的単純です。つまり、エラー メッセージが直接返され、ここでの例外処理についても後で説明します。3 つの状況の実行後
3 つの状況の分析が完了すると、統計的手法が実行されます。最終的には実行されます。
リフレクション実行クラスの呼び出しメソッドはパラメータバインディングをサポートしています。つまり、ここでのクロージャ実行プロセスはここで完了します。
次の自動リクエストについては、セクション 5 で詳しく説明します。
次はこのルートをケースとして使用します
ルート検出開始時の戻り値を覚えておいてください?下の図を参照してください。
当時は以下のコードの詳細な説明はなく、インスタンス化されたコントローラーについて直接説明されていましたが、今回話したいのは、現在のスケジューリング情報を記録する
行です。コードの。
Here$this->request
は、存在しないプロパティにアクセスするときにコンテナ クラスのマジック メソッドを実行するために使用され、最終的にコンテナを通じてインスタンスを返します。
したがって、コードは以下に示す位置まで実行され、現在のリクエストのスケジュール情報を設定または取得します
コントローラーをインスタンス化するときにここに出力すると、ここで返される値が index
であることがわかります。この値はコントローラーに設定されます。コントローラーを使用して表示します。
init メソッドに移動し、ルーティング アドレスを使用して結果を印刷し、結果を表示します。
ここの値がなぜ変更されたかわかりますか?
上に印刷された値は下の図ですが、なぜここでは上の図なのでしょうか。
ルーティング セクションの最後のステップでは、ルーティング スケジューリングを開始し、最後にモジュールへのルートを呼び出します。 / コントローラー/アクションのこのメソッド。
このメソッドdispatchModule
最後にクラスもインスタンス化します。次にクラスを作成する必要があります。さらなる研究
#
コード トレースによると、実際には think\route\dispatch\Module
This クラスであることがわかります。
クラス Module
にアクセスすると、次のことがわかります。 Dispatch
Class
の継承 thinkphp/library/think/ Route/Dispatch.php
this クラスのコントローラーで、変数 dispatch
が設定されていることがわかります。
今回を振り返ってみましょうモジュール/コントローラー/オペレーションへのルーティング
ここに渡されるメソッドパラメータは入力されていますか? (笑)
つまり、最終値は次のとおりです。単一の配列形式で出力されました。
次のアクションは、ルーティング アクセスを使用しないプロセスと同じです。必要はありません。分析済み。
これでルーティング アドレスのインスタンス化方法は終了です。
$this->app->controller
については、index
が渡され、クラス名全体が返されます。具体的な実装プロセスは解析されません。実装メソッドは $this->parseModuleAndClass
です。独自に調査することができます。
セクション 4 では、実行コントローラー内のメソッドがその場所から実行されることについてのみ言及されています。下図では返品しましたが、返品方法については詳しく説明しておりません。
次に、実行方法について説明します。
アクセスルーティングアドレスは以下の通りで、返されたデータが必要なデータであることがわかります。コントローラに返されます。印刷されたデータ値は次のとおりです。写真の場所。ここで明確にする必要があります。ソースコードを読むには少し調べる必要がありますが、時間が経つにつれて内容が理解できるようになります。
次のステップは $this->autoResponse($data);
このメソッドは詳細な分析を実行します。このメソッドは文字通り自動的に応答します。
この実行プロセスの最初の行$data instanceof Response
、これを理解していないと実行できません。それを読むために。
知らないこと、理解できないことは解決する必要があり、ソースコードを読んで少しずつ攻略してこそ勝てます。
instanceof の使用について
Instanceof は、オブジェクトが特定のクラスのインスタンスであるかどうか、およびオブジェクトが特定のインターフェイスを実装しているかどうかを判断できます。
次に、Kaka がこれを示す簡単な例を示します。そうすれば、何が起こっているのか理解できるでしょう。
ケース 1
まず、クラスを 2 つ作成します。
下の図は印刷結果で、1つ目はtrueを返し、2つ目はfalseを返すことがわかります。
オブジェクトが特定のクラスのインスタンスであるかどうかを判断します。つまり、$instance
はクラス Test
のインスタンスであるため、true を返します。
ケース 2
ケース 2 はケース 1 とは異なります。この場合、インターフェイスが確立され、クラスがそのインターフェイスを実装します。最終的な戻り結果はすべて true です。これは、クラスが別のインターフェイスを実装している場合、判定時に true になることを意味します。
上記は、instanceof
を理解するために与えられた 2 つのデモンストレーション ケースです。インスタンスが特定のクラスのインスタンスであるかどうかを判断することです。
次に、テキストに戻ります。$data instanceof Response
このコード行は、渡されるデータがコントローラーによって返される値であるため、絶対に確立されません。
ということで、以下の位置までコード実行処理が実行されます is_null
関数を使って判定します 判定は偽でなければなりませんので、以下のコードが実行されます。
このコードの最初の 2 つのポイントは解析されません。
最初の方法は、デフォルトで応答の出力タイプを自動的に識別することです。これは、それが Ajax リクエストであるかどうかを判断するためです。具体的な実装方法は、今回は Kaka がフレームワークのソース コードを解析するまで待機し、その後、しばらく時間がかかります毎日時間をかけてフレームワークのメソッドをいくつか学び、少し詳しく調べてみましょう。
2 番目の位置は、構成ファイルから対応する構成情報を取得することで、実行されるルール クラスのメソッドに注目しますが、メソッド内には構成情報を取得するために実行されるコードが含まれます。
次に、言及されていない 3 番目のステップを実行する必要があります。上記は解析されます。つまり、コード $response = Response::create($data, $type);
がクラス thinkphp/library/think/Response に追加されます。 .php
メソッド create
では、このメソッドは Response オブジェクトの作成に使用されます。
Kaka で囲んだ場所に注目してください。thinkphp/library/think/response
ディレクトリには HTML がありません。
したがって、コードはこのクラスを直接インスタンス化してから戻ります。
このクラスのコンストラクターでは、主にいくつかのことを行います。
その後、コードは戻り値をこのメソッド
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
が返され、返された情報は以下のように出力されます。
##返品情報を印刷
Kaka で囲まれた場所の次のコード行もミドルウェアに関するもので、最終的に返される結果が図に表示されている結果と同じであることだけを知っておく必要があります。ミドルウェア層に戻る
、ここから分析を開始します。返された結果を $data
に返し、それを実行しますreturn $this->autoResponse( $data );
お読みのとおり、ここのコードには見覚えがあるはずです。
今回返される結果は Response
のインスタンスなので、$response
が直接返されます。
ここまでで、コントローラー内のメソッドが実行され、応答が解析されます。
設定したルーティングルールであっても、モジュールコントローラメソッドによる直接アクセスであっても、最終的には上記のメソッドで応答結果が返されます。
「学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」少し持ってきてください助けてください。私はカカです。また今度。
”
以上がThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。