源码阅读-ThinkPHP-5-运行应用

运行应用主要涉及到 3 个步骤:

  1. 定义了些关于请求的常量

  2. URL 调度

  3. 执行应用

下面分别来看这 3 个部分。

定义请求常量

上回书说道,应用初始化的最后调用了App::start(),即App.class.php的静态方法start

那么久看看这个方法中执行了些什么?

主要下面两句代码:

App::init();
App::exec();

我们先来看看第init中执行了些什么:

define('REQUEST_METHOD',...);
define('IS_GET',...);
define('IS_POST',...);
define('IS_PUT',...);
define('IS_DELETE',...);
define('IS_AJAX',...);

正如你所见,定义了这些请求的布尔值常量。

另外,调用了Dispatcher::dispatch();,实现了 URL 调度。我们接下来分析:

URL 调度

接下来,来看看Dispatchaer.class.php,这个类实现了 URL 的解析、路由和调度。

先看dispatch这个方法。

获取与路径相关的常量

首先获取配置中的常量,这些常量定义在convention.php中。

$varPath        =   C('VAR_PATHINFO');
$varAddon       =   C('VAR_ADDON');
$varModule      =  C('VAR_MODULE');
$varController  = C('VAR_CONTROLLER');
$varAction      =   C('VAR_ACTION');
$urlCase =  C('URL_CASE_INSENSITIVE');

例如$varModule默认为m,$varAddon默认为a,$varController默认为c。这些对应的是路径中路由参数,例如:

http://www.abc.com?m=user&c=user&a=login

是否在兼容模式或 CLI 模式下

是否开启子域名部署

分析PATHINFO信息

执行应用

前置/后置操作的实现

查看如下代码(位于App.class.php大概126行前后):

if($class->hasMethod('_before_'.$action)) {
    $before =   $class->getMethod('_before_'.$action);
    if($before->isPublic()) {
        $before->invoke($module);
    }
}

判断是否拥有前置方法,例如_before_index()
如果有,利用getMethod返回这个类方法的 ReflectionMethod 。接着判断是否公开,然后反射执行。

之后执行控制器方法:

$method->invoke($module);

后置操作同理,在执行控制器方法之后。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 可以查看我做的简易流程图。 也可以看官方的标准答案。 用户URL请求 调用应用入口文件(通常是网站的index.p...
    苏近之2017阅读 798评论 0 3
  • 一、在后台工作量少 当用户没有主动使用你的应用程序时,系统会将其转换为背景状态。该系统最终可能会暂停您的应用程序,...
    弗利撒阅读 921评论 1 0
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,469评论 0 35
  • 那是一朵带刺的野花 在鲜活的心头 扎出渗血的孔 我看着它慢慢刺破 强忍着的剧痛 终于 花被染得通红 那里肆虐着佞笑
    王不烦阅读 94评论 0 1