Thinkphp5运行原理
2022-07-28 14:14:58
140
{{single.collect_count}}

ThinkPHP5.0源码学习之执行应用

一、应用启动

在/thinkphp/start.php文件中,用一句代码App::run()->send();实现应用的启动。

// 执行应用

App::run()->send();

 

run()方法可以在/thinkphp/library/think/App.php文件中找到对应方法,这个方法是整个框架的核心方法,实现了路由转换、获取调度信息、根据调度信息执行相应模块控制器的方法、获取方法返回数据、将返回数据赋值给Response对象等一系列操作。

 

最后,调用返回的Response对象的send()方法将信息返回给客户端,一次完整的http请求就完成了。

 

二、应用调度分析

其中,第12~18步的路由分析和应用调度是框架从底层到应用跳转的核心部分,对URL进行路有分析,获取URL可以使用的调度类型,再根据调度类型,分别调用应用的对应逻辑业务实现。

第18步应用调度 $data = self::exec($dispatch, $config); 的源代码(thinkphp/library/think/App::exec())如下:

 

$dispatch['type']是App::run()中经过self::routeCheck()、Request::dispatch()后得到的。

 

$dispatch['type']为redirect时,执行重定向跳转Response::create();

$dispatch['type’]为module时,调用self::module();

$dispatch['type']为controller时,调用自动加载器Loader::action();

$dispatch['type']为method时,调用self::invokeMethod();

$dispatch['type']为function时,调用self::invokeFunction();

$dispatch['type']为response时,获取$dispatch['response'];

超出以上调度类型,直接抛出异常报错。

 

6种调度类型中,除redirect、controller、response,其余3种调度类型都是调用的App内的静态方法:

moudule——self::module()

method——self::invokeMethod()

function——self::invokeFunction()

3个静态方法的实现原理基本相同,依次为调用参数分析,反射回调相应方法。

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}