美文网首页
源码阅读-ThinkPHP-5-运行应用

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

作者: 苏近之2017 | 来源:发表于2017-06-06 16:34 被阅读0次

    运行应用主要涉及到 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);
    

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

    相关文章

      网友评论

          本文标题:源码阅读-ThinkPHP-5-运行应用

          本文链接:https://www.haomeiwen.com/subject/scfnfxtx.html