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

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

咔咔
咔咔オリジナル
2020-12-04 12:57:26166ブラウズ

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

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

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的形式,这俩种概念一定要区分清楚。

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

接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index

これにもミドルウェアの概念がありますが、ミドルウェアについては次の記事で別途言及するため、ここでは説明しません。 🎜🎜ここ$this->app['ミドルウェア ' ]->controller このコードを使用するとき、それが ArrayAccess なのか __get なのかをまだ思い出せますか? 🎜🎜ここではオブジェクトにアクセスするために配列アクセスの形式を使用しているため、2 つの概念は明確に区別する必要があります。 🎜🎜ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?🎜リフレクションを通してコントローラーメソッドを実行するとメソッド名が取得されます。メソッド名の取得方法はこのクラスにあります。 init メソッドが実行されると、返される内容は index 以上です。 🎜

ここで注意する必要があるのは、次のコード行です$this->rule->getConfig('action_suffix'),这里获取的是ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?。

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

假如现在给这个ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?设置一个值会变成什么样子呢!

给添加一个kaka的值,进行访问一下看会是什么结果。

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

这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。

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

对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {,在这里可以看见我们的老朋友is_callable

对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex的实例,第二个参数为index

ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
操作メソッドのサフィックス

この操作メソッドのサフィックスに値を設定するとどうなるでしょうか。 🎜🎜kaka 値を追加し、それにアクセスして結果を確認します。 🎜
ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
テスト用に kaka を追加しました
🎜この時点でアクセスすると、indexkaka メソッドが存在しないことが表示されます。これは明確に表示されますか? これを説明してください。パラメーターはすべてのメソッド名に kaka を追加します。 🎜
ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?する
🎜 現在の操作名を取得するためのコードの展開が完了したら、次のステップは 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判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。

第一种情况:类里边存在可执行的方法

  • 首先返回一个 ReflectionMethod 类
  • 获取方法名 index
  • 未设置方法名后缀返回空
  • 设置当前的操作名
  • 在这个案例中没有设置参数,所以最终的$vars
    インデックス クラスにはインデックス メソッドがあるため、ここでは明らかに true が返されます。
ここでテストを実行する前に、アプリ構成ファイルで構成したばかりのメソッド名のサフィックスをキャンセルする必要があります。

これにより、is_callable の 3 つの判定があります。この場合、カカは 3 つの側面から分析します。
ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?最初の状況: クラス内に実行可能なメソッドがあります
  • 最初に ReflectionMethod クラスを返します
  • メソッド名インデックスを取得します

  • メソッド名のサフィックスが設定されていない場合は、空を返します🎜🎜
  • 現在の操作名を設定します🎜
  • この場合、パラメータは設定されていないため、最後の $vars は空の配列です。 🎜🎜🎜🎜このコードをパラメーターを使用してテストするには、ルーティング アドレスに少し変更を加える必要があります。 🎜🎜🎜🎜コードの一部をテストします🎜🎜🎜これまでルーティングを使用しませんでしたが、デフォルトのアドレスを直接使用しました。このルーティングアドレスは次に使用されます🎜。
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    テストに新しいルーティング アドレスを使用します

    このルーティング アドレスを使用してデータを印刷すると、これが設定したルーティング パラメーターであることがわかります。

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

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

    框架是如何获取参数的

    访问地址:http://www.source.com/index.php/hello/hello

    在上文知道是通过$this->request->param()来获取参数的,那么在框架是如何获取参数的呢!

    根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。

    所以代码会执行到$this->param

    アクセスアドレス: http://www.source.com/index.php/hello/hello🎜🎜 上で知っているように、それは $this->request->param() でパラメータを取得します。 , では、フレームワークでパラメータを取得するにはどうすればよいでしょうか? 🎜🎜処理コードによれば、取得したリクエストメソッドに従って、対応するメソッドを使用してパラメータを取得します。ここで明確にする必要があるのは、getリクエストを使用しているということです。 🎜🎜そのため、コードは $this-&gt ;param では、現在のリクエストパラメータと URL アドレス内のパラメータがここでマージされます。ここで丸で囲まれた場所に注目してください。 🎜🎜Kaka はルーティングを使用してリクエストを行うため、ここでのフレームワークはルーティング用のリクエスト パラメーターを具体的にカプセル化します。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    現在のリクエストのパラメータを取得します

    ここに来てくださいroute メソッドのコメントを見ると、ルーティング パラメータを取得するために使用されていることがわかりますが、それでも入力層に入る必要があります。 route方法,看到注释就明白是用来ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?的,但是还是需要在进入一层到input。

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

    在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。

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

    所以说$this->route就是存放的这条路由规则所有的参数,包含路由参数。

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

    这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route

    ルーティング パラメーターを取得する🎜ルーティング パラメーターを取得する🎜🎜🎜 前回のルーティングの記事では、ルーティング パラメーターを取得すると、パラメーターはリクエストのルート属性にマージされます。 🎜🎜ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?🎜ルーティング変数を設定します🎜🎜つまり、$this->route は、ルーティング パラメータを含む、このルーティング ルールのすべてのパラメータが保存される場所です。 🎜🎜ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?🎜結果を印刷🎜🎜🎜このとき、フィルタリングをサポートする変数とデフォルト値を取得するための実行処理が実行されます。上記では、$this->route渡されたパラメータは false であるため、このブロックは直接返却される。 🎜
    获取变量 支持过滤和默认值
    変数の取得はフィルタリングとデフォルト値をサポートします

    ここで返された結果は、上で解析を開始した場所、つまりこの $vars は取得されたルーティングパラメータです。 $vars就是获取到的路由参数。

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

    第二种情况:类里边不存在可执行的方法

    当第一种判断执行is_callable判断类里边的方法不可执行时,就会执行到第二种情况。

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

    先来请求的一个没有设置的路由地址,看会返回什么。

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

    根据代码给的提示,我们来到index控制器建立一个_empty

    返されたルーティング パラメーターの結果🎜返されたルーティング パラメーターの結果🎜🎜 2 つの状況:クラス内に実行可能なメソッドがありません🎜🎜最初の判定が実行されるときis_callableクラス内のメソッドが実行可能でないと判断された場合、2 番目の状況が実行されます。 🎜🎜2 番目の実行状況🎜2 番目の実行ケース🎜🎜🎜まず、設定されていないルーティング アドレスをリクエストし、何が返されるかを確認します。 🎜🎜ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?🎜エラーが返されました🎜🎜🎜 コードによって示されるプロンプトに従って、インデックス コントローラーに移動して、_empty メソッドを実行して、何が起こるかを再度リクエストします。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    コントローラーに_emptyメソッドを設定します

    アクセスしたメソッドが存在しない場合、このメソッドが実行されることがThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?から分かります_empty

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

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

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

    このケースは比較的単純で、エラー メッセージを直接返すだけです。ここでの例外処理についても後で説明します。

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

    3つの状況を実行した後

    3つの状況を分析した後、最後に統計的手法が実装されます。

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

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

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

    2. ルーティングアドレスがコントローラーによってどのようにインスタンス化されるか

    前のセクションでは、3 つまたは 4 つの期間のルーティングについて説明しました。最後の説明はルーティングのスケジューリングです。設定したルーティングの実行方法!

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

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

    ルート検出を開始したときの戻り値が何だったか覚えていますか?下の図を見てください

    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    ルート検出
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    その時は、以下のコードの詳細な説明はありませんでした。私が言いたいことは、以下のコードです。現在は 現在のスケジュール情報を記録しますコード。
    ここ$this->リクエスト存在しないプロパティにアクセスするときにコンテナ クラスのマジック メソッドを実行するために使用され、最後にコンテナを通じてインスタンスを返します。

    记录当前调度信息这行代码。

    在这里$this->requestそのため、現在のリクエストのスケジュール情報を設定または取得するために、以下に示す位置までコードが実行されます

    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    現在のリクエストのスケジュール情報を設定または取得します

    コントローラーのインスタンス化でここに出力すると、ここで返される値がindexであることがわかります。次に、コントローラーに来て確認します。それはアウトです。

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

    ルーティングアドレスを使用して結果を表示するには、init メソッドに来てください

    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    データを印刷する
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    ルーティングアドレスを使用する
    没有ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    いいえ住所

    ここの値がなぜ変化したか知っていますか?

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

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

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

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

    このメソッド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最后也是实例化一个类,接下来需要对这个类进行深究

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

    根据代码追踪可以看到其实就是thinkroutedispatchModule这个类

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

    来到Module这个类,又会发现继承着Dispatch

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

    thinkphp/library/think/route/Dispatch.php这个类的控制器中,会发现对dispatch

    モジュール/コントローラーへのルート/ アクション🎜 に従って module/controller/action にルーティングされますコード トレースすると、実際には 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 ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?thinkphp/library/think/route/Dispatch.phpこのコントローラー内クラスでは、ディスパッチが設定されています。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    変数の割り当て

    今回を振り返って見てみましょう module/controller/operation へのルートここでメソッドに渡されるパラメータは何ですか、笑ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?这里的方法传入的参数是什么,哈哈

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

    所以说最终的值就是刚刚打印的只是单独的数组形式的。

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

    那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。

    直到这里关于路由地址是怎么进行控制器实例化的就结束了。

    关于给$this->app->controller传入的是index,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass

     modules/controllers/actions にルーティングされるパラメータ

    モジュールへのルーティング/ コントローラー/オペレーションのパラメーターそのため、最終的な値は別の配列の形式で出力されるだけです。 ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?コントローラーをインスタンス化します

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

    これで、コントローラー内でルーティング アドレスがインスタンス化される方法は終了です。 🎜🎜$this->app-> インデックスクラス名全体が返され、特定の実装プロセスは解析されません。実装メソッドは $this->parseModuleAndClass を使用して、独自の調査を行うことができます。 🎜🎜🎜🎜🎜3. autoResponseスケジューリングを実行する🎜🎜🎜🎜🎜 4番目のセクションでは、実行コントローラー内のメソッドが下図の場所から戻ることだけが記載されており、戻り方については詳しく説明されていません。 🎜🎜 次に、実行方法について少し説明します。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    自動リクエスト

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

    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    コントローラーから返されたデータ
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    データの値を出力します

    出力された値は下の図に示されているとおりです。ここで明確にする必要があります。ソースコードを読むには少し調べる必要がありますが、時間が経つと内容が理解できるようになります。

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

    次に、$this ->autoResponse($data);このメソッドは詳細な分析を実行します。このメソッドは文字通り自動応答を意味します。 $this->autoResponse($data);这个方法进行深入的解析,这个方法按照字面意思就是ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?。

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

    在这个执行流程的第一行中$data instanceof Response

    自動応答🎜自動応答🎜🎜🎜この実行プロセスでは最初の行$data インスタンスこれを理解していないと読めません。 🎜

    分からないことや理解できないことは、ソースコードを読んで少しずつ克服して勝つ必要があります。

    instanceofの使用について

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

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

    ケース1

    まず、以下のような2つのクラスを作成します。

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

    下の図はThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?です。最初のものが true を返し、2 つ目のものが false を返すことがわかります。

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

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

    ケース 2

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

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

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

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

    上記は、与えられた 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 番目の位置は、設定ファイルから対応する設定情報を取得することであり、実行されるルール クラスのメソッドを参照しますが、メソッド内には設定情報を取得するために実行されるコードがあります。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    コード実行プロセスが実行される最初のポイント

    次に、上記で言及されていない 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 がありません。
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?そのため、コードはこのクラスを直接インスタンス化してから戻ります。

    Response オブジェクトを作成する

    🎜🎜このクラスのコンストラクターでは、主にいくつかのことを行います。 🎜
    • 戻り値をこのクラスのデータ属性に代入
    • ページ出力タイプを設定
    • 戻りステータスコード
    • アプリインスタンスオブジェクトを設定
    • ヘッダー情報
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    ここに画像の説明を挿入します

    その後、コードは戻り値を 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

    最後に、これを追加します $responsegive以下に示すように、結果を返して出力します。
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    ここに画像の説明を挿入します
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    リターン情報を出力します

    その後、コードは依然として上位層に戻り、元のクロージャ関数に戻ります。

    Kaka で囲まれた場所のコードの次の行もミドルウェアに関するものです。最終的な戻り結果が図に表示されている結果と同じであることを知っておく必要があります。 🎜
    ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    中級レベルに戻る

    最終的な戻り結果は thinkphp/library/think/route/Dispatch.php、ここから分析を開始します。 thinkphp/library/think/route/Dispatch.php,咱们也就是从这里开始的解析的。

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

    将返回的结果返回给$data,然后在进行执行return $this->autoResponse($data);

    你没看错,这里的代码熟悉吧!

    这个时候返回的结果就是Response的实例,所以会直接返回$response

    ここに画像の説明を挿入
    ここに画像の説明を挿入ThinkPHP ルーティング アドレスはどのようにコントローラーをインスタンス化しますか?
    返された結果を $data次に、return $this->autoResponse( $data) ;

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

    この時に返される結果は、応答 インスタンスなので、直接 $response

    🎜🎜🎜自動応答🎜🎜🎜ここまでで、コントローラー内のメソッドが実行され、応答が解析されます。 🎜🎜設定されたルーティングルールであっても、モジュールコントローラーメソッドによる直接アクセスであっても、最終的には上記メソッドを通じて応答結果が返されます。 🎜
    「学習への粘り強さ、ブログへの粘り強さ、そして共有への粘り強さは、カカがキャリア以来貫いてきた信念です。巨大なインターネット上のカカの記事が少しでもお役に立てれば幸いです。」カカ、次号でお会いしましょう

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

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