运行应用主要涉及到 3 个步骤:
-
定义了些关于请求的常量
-
URL 调度
-
执行应用
下面分别来看这 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);
后置操作同理,在执行控制器方法之后。
网友评论