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个静态方法的实现原理基本相同,依次为调用参数分析,反射回调相应方法。