ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
この記事のリクエストアドレスは、設定されているドメイン名です。
上記から知ることができます$instance
の値は appindexcontrollerIndex code> インスタンス。 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$instance
的值就是appindexcontrollerIndex
的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
这段代码的使用,还能记得是使用的ArrayAccess还是直接为__get吗?
这里是在使用访问数组的形式访问对象,所以使用的是ArrayAccess的形式,这俩种概念一定要区分清楚。
接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index
$this->app['ミドルウェア ' ]->controller
このコードを使用するとき、それが ArrayAccess なのか __get なのかをまだ思い出せますか? 🎜🎜ここではオブジェクトにアクセスするために配列アクセスの形式を使用しているため、2 つの概念は明確に区別する必要があります。 🎜🎜🎜リフレクションを通してコントローラーメソッドを実行するとメソッド名が取得されます。メソッド名の取得方法はこのクラスにあります。 init メソッドが実行されると、返される内容は index
以上です。 🎜ここで注意する必要があるのは、次のコード行です$this->rule->getConfig('action_suffix')
,这里获取的是ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?。
假如现在给这个ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?设置一个值会变成什么样子呢!
给添加一个kaka的值,进行访问一下看会是什么结果。
这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。
对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {
,在这里可以看见我们的老朋友is_callable
。
对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex
的实例,第二个参数为index
if (is_callable([$instance, $action])) {
、ここで次のことができます。私たちの古い友人を参照してくださいis_callable
。 🎜🎜 ここでの is_callable の 2 つのパラメーターが何であるかは、上記のことからわかります。最初のパラメーターは appindexcontrollerIndex
のインスタンス、2 番目のパラメータは index
操作メソッドを実行します。 🎜次に、is_callable
は、 -サイズ: 14px; ワードラップ: ブレークワード: 2px 4px; マージン: 0 2px; フォントファミリー: 演算子Mono, Consolas, Monaco, Menlo, monospace; word-break: Break-all; color: rgb(271, 93, 108);">index
メソッド名が実行可能かどうか。 is_callable
的作用就是检测在appindexcontrollerIndex
类中的index
方法名是否可以执行。
很明显这里会返回一个true,因为在index类里边存在index方法的。
这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。
通过这个is_callable
判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。
第一种情况:类里边存在可执行的方法
$vars
is_callable
の 3 つの判定があります。この場合、カカは 3 つの側面から分析します。 $vars
は空の配列です。 🎜🎜🎜🎜このコードをパラメーターを使用してテストするには、ルーティング アドレスに少し変更を加える必要があります。 🎜🎜🎜🎜コードの一部をテストします🎜🎜🎜これまでルーティングを使用しませんでしたが、デフォルトのアドレスを直接使用しました。このルーティングアドレスは次に使用されます🎜。このルーティング アドレスを使用してデータを印刷すると、これが設定したルーティング パラメーターであることがわかります。
リクエスト変数を取得するこのメソッドは、$this->request->param();
このコード行$this->request->param();
这行代码
框架是如何获取参数的
访问地址:http://www.source.com/index.php/hello/hello
在上文知道是通过$this->request->param()
来获取参数的,那么在框架是如何获取参数的呢!
根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。
所以代码会执行到$this->param
$this->request->param()
でパラメータを取得します。 , では、フレームワークでパラメータを取得するにはどうすればよいでしょうか? 🎜🎜処理コードによれば、取得したリクエストメソッドに従って、対応するメソッドを使用してパラメータを取得します。ここで明確にする必要があるのは、getリクエストを使用しているということです。 🎜🎜そのため、コードは $this-> ;param
では、現在のリクエストパラメータと URL アドレス内のパラメータがここでマージされます。ここで丸で囲まれた場所に注目してください。 🎜🎜Kaka はルーティングを使用してリクエストを行うため、ここでのフレームワークはルーティング用のリクエスト パラメーターを具体的にカプセル化します。 🎜ここに来てくださいroute
メソッドのコメントを見ると、ルーティング パラメータを取得するために使用されていることがわかりますが、それでも入力層に入る必要があります。 route
方法,看到注释就明白是用来ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?的,但是还是需要在进入一层到input。
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
所以说$this->route
就是存放的这条路由规则所有的参数,包含路由参数。
这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route
$this->route
は、ルーティング パラメータを含む、このルーティング ルールのすべてのパラメータが保存される場所です。 🎜🎜🎜結果を印刷🎜🎜🎜このとき、フィルタリングをサポートする変数とデフォルト値を取得するための実行処理が実行されます。上記では、$this->route
渡されたパラメータは false であるため、このブロックは直接返却される。 🎜ここで返された結果は、上で解析を開始した場所、つまりこの $vars
は取得されたルーティングパラメータです。 $vars
就是获取到的路由参数。
第二种情况:类里边不存在可执行的方法
当第一种判断执行is_callable
判断类里边的方法不可执行时,就会执行到第二种情况。
先来请求的一个没有设置的路由地址,看会返回什么。
根据代码给的提示,我们来到index控制器建立一个_empty
is_callable
クラス内のメソッドが実行可能でないと判断された場合、2 番目の状況が実行されます。 🎜🎜🎜2 番目の実行ケース🎜🎜🎜まず、設定されていないルーティング アドレスをリクエストし、何が返されるかを確認します。 🎜🎜🎜エラーが返されました🎜🎜🎜 コードによって示されるプロンプトに従って、インデックス コントローラーに移動して、_empty
メソッドを実行して、何が起こるかを再度リクエストします。 🎜アクセスしたメソッドが存在しない場合、このメソッドが実行されることがThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?から分かります_empty
。
それでは、このメソッドはどのように実行されるのでしょうか?この実行方法は、リフレクション メカニズムを使用して実現されます。リフレクション Kaka を説明する記事が以前に公開されましたが、ドキュメントを読んで確認する必要があります。
3 番目のケース: クラスに実行可能なメソッドまたは _empty メソッドがありません
このケースは比較的単純で、エラー メッセージを直接返すだけです。ここでの例外処理についても後で説明します。
3つの状況を実行した後
3つの状況を分析した後、最後に統計的手法が実装されます。
リフレクション実行クラスの呼び出しメソッドはパラメータバインディングをサポートしています。つまり、ここでのクロージャ実行プロセスはここで完了します。
以降の自動リクエストについては、セクション5で詳細を説明します。
前のセクションでは、3 つまたは 4 つの期間のルーティングについて説明しました。最後の説明はルーティングのスケジューリングです。設定したルーティングの実行方法!
次にこのルートをケースとして使用します
ルート検出を開始したときの戻り値が何だったか覚えていますか?下の図を見てください
ここ$this->リクエスト
存在しないプロパティにアクセスするときにコンテナ クラスのマジック メソッドを実行するために使用され、最後にコンテナを通じてインスタンスを返します。 记录当前调度信息
这行代码。
在这里$this->request
そのため、現在のリクエストのスケジュール情報を設定または取得するために、以下に示す位置までコードが実行されます
コントローラーのインスタンス化でここに出力すると、ここで返される値がindex
であることがわかります。次に、コントローラーに来て確認します。それはアウトです。
ルーティングアドレスを使用して結果を表示するには、init メソッドに来てください
ここの値がなぜ変化したか知っていますか?
上に印刷された値は下の写真ですが、なぜここでは上の写真なのでしょうか。
ルーティング セクションの最後のステップは、ルーティング スケジューリングを開始し、最後にモジュール/コントローラー/操作メソッドへのルーティングを呼び出すことです。
このメソッドdispatchModule code>最後に、クラスがインスタンス化されます。次に、このクラスを詳しく学習する必要があります<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">dispatchModule
最后也是实例化一个类,接下来需要对这个类进行深究
根据代码追踪可以看到其实就是thinkroutedispatchModule
这个类
来到Module
这个类,又会发现继承着Dispatch
类
在thinkphp/library/think/route/Dispatch.php
这个类的控制器中,会发现对dispatch
thinkroutedispatchModule code>このクラス 🎜🎜<img src="https://img-blog.csdnimg.cn/20201111141709893.png" alt="ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?" style="max-width:90%"> クラス 🎜🎜 のエイリアスが来ます<code style="font-size: 14px; ; 境界半径: 4px; 背景色: rgba(27,31,35,.05); 演算子 Mono、Consolas、Menlo、ワードブレイク: ブレークオール; color: rgb (271, 93, 108);">モジュール
では、ディスパッチ
クラス🎜🎜thinkphp/library/think/route/Dispatch.php
このコントローラー内クラスでは、ディスパッチ
が設定されています。 🎜今回を振り返って見てみましょう module/controller/operation へのルート
ここでメソッドに渡されるパラメータは何ですか、笑ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
这里的方法传入的参数是什么,哈哈
所以说最终的值就是刚刚打印的只是单独的数组形式的。
那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。
直到这里关于路由地址是怎么进行控制器实例化的就结束了。
关于给$this->app->controller
传入的是index
,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass
$this->app->
は インデックス
クラス名全体が返され、特定の実装プロセスは解析されません。実装メソッドは $this->parseModuleAndClass
を使用して、独自の調査を行うことができます。 🎜🎜🎜🎜🎜3. autoResponseスケジューリングを実行する🎜🎜🎜🎜🎜 4番目のセクションでは、実行コントローラー内のメソッドが下図の場所から戻ることだけが記載されており、戻り方については詳しく説明されていません。 🎜🎜 次に、実行方法について少し説明します。 🎜アクセスルーティングアドレスは以下の通りです。返されたデータはコントローラーで返す必要があるデータであることがわかります。
出力された値は下の図に示されているとおりです。ここで明確にする必要があります。ソースコードを読むには少し調べる必要がありますが、時間が経つと内容が理解できるようになります。
次に、$this ->autoResponse($data);
このメソッドは詳細な分析を実行します。このメソッドは文字通り自動応答を意味します。 $this->autoResponse($data);
这个方法进行深入的解析,这个方法按照字面意思就是ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?。
在这个执行流程的第一行中$data instanceof Response
$data インスタンス
これを理解していないと読めません。 🎜分からないことや理解できないことは、ソースコードを読んで少しずつ克服して勝つ必要があります。
instanceofの使用について
Instanceofは、オブジェクトが特定のクラスのインスタンスであるかどうか、およびオブジェクトが特定のインターフェースを実装しているかどうかを判断できます。
次に、Kaka がこれを示す簡単な例を示します。そうすれば、何が起こっているのか理解できるでしょう。
ケース1
まず、以下のような2つのクラスを作成します。
下の図はThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?です。最初のものが true を返し、2 つ目のものが false を返すことがわかります。
は、オブジェクトが特定のクラスのインスタンス、つまり $instance
就是类Test
のインスタンスであるかどうかを判断するため、true を返します。
ケース 2
ケース 2 はケース 1 とは異なります。インターフェイスが確立され、クラスがそのインターフェイスを実装します。
最終的な戻り結果はすべてtrueです。これは、クラスが別のインターフェースを実装している場合、判定時にtrueになることを意味します。
上記は、与えられた 2 つのデモ ケースを理解すると、インスタンスが特定のクラスのインスタンスであるかどうかを判断できます。 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">instanceof
给出的俩种ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?,对其理解就是判断一个实例是否为某个类的实例。
那么就在回到正文,$data instanceof Response
这行代码肯定不会成立,因为data传过来的就是控制器返回的值。
所以说代码执行流程会执行到下图位置,使用了is_null
$data インスタンスオブ レスポンス
渡されるデータはコントローラーから返される値であるため、このコード行は間違いなく機能しません。 そのため、is_null
関数は判定を行います。判定は false でなければならないため、次のコードが実行されます。 このコードの最初の 2 つのポイントは分析されません。 1 つ目は、デフォルトで応答の出力タイプを自動的に識別することです。これは、今回の特定の実装方法は、Kaka がフレームワークのソース コードを解析するまで待機し、その後しばらく時間がかかります。毎日、フレームワークのいくつかのメソッドを少しずつ実行します。 🎜🎜 2 番目の位置は、設定ファイルから対応する設定情報を取得することであり、実行されるルール クラスのメソッドを参照しますが、メソッド内には設定情報を取得するために実行されるコードがあります。 🎜次に、上記で言及されていない 3 番目の部分である code$response = Response::create($data, $type);
$response = Response::create($data, $type);
来到类thinkphp/library/think/Response.php
的方法create
中,这个方法就是用来ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?。
这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response
thinkphp/library/think/Response.php
create
、このメソッドは Response オブジェクトを作成するために使用されます。 ここでは、thinkphp/library/think/response
このディレクトリには HTML がありません。 Response オブジェクトを作成する
🎜🎜このクラスのコンストラクターでは、主にいくつかのことを行います。 🎜その後、コードは戻り値を autoResponse
$response この変数。 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">autoResponse
这个方法的$response
这个变量。
最后就是将这个$response
$response
give以下に示すように、結果を返して出力します。 その後、コードは依然として上位層に戻り、元のクロージャ関数に戻ります。 Kaka で囲まれた場所のコードの次の行もミドルウェアに関するものです。最終的な戻り結果が図に表示されている結果と同じであることを知っておく必要があります。 🎜最終的な戻り結果は thinkphp/library/think/route/Dispatch.php
、ここから分析を開始します。 thinkphp/library/think/route/Dispatch.php
,咱们也就是从这里开始的解析的。
将返回的结果返回给$data
,然后在进行执行return $this->autoResponse($data);
你没看错,这里的代码熟悉吧!
这个时候返回的结果就是Response
的实例,所以会直接返回$response
お読みのとおり、ここのコードには見覚えがあるはずです。
この時に返される結果は、応答
インスタンスなので、直接 $response
。
「学習への粘り強さ、ブログへの粘り強さ、そして共有への粘り強さは、カカがキャリア以来貫いてきた信念です。巨大なインターネット上のカカの記事が少しでもお役に立てれば幸いです。」カカ、次号でお会いしましょう」
以上がThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。