運(yùn)行應(yīng)用主要涉及到 3 個步驟:
定義了些關(guān)于請求的常量
URL 調(diào)度
執(zhí)行應(yīng)用
下面分別來看這 3 個部分验毡。
定義請求常量
上回書說道逃延,應(yīng)用初始化的最后調(diào)用了App::start()
,即App.class.php
的靜態(tài)方法start
羡儿。
那么久看看這個方法中執(zhí)行了些什么?
主要下面兩句代碼:
App::init();
App::exec();
我們先來看看第init
中執(zhí)行了些什么:
define('REQUEST_METHOD',...);
define('IS_GET',...);
define('IS_POST',...);
define('IS_PUT',...);
define('IS_DELETE',...);
define('IS_AJAX',...);
正如你所見,定義了這些請求的布爾值常量训措。
另外,調(diào)用了Dispatcher::dispatch();
,實(shí)現(xiàn)了 URL 調(diào)度光羞。我們接下來分析:
URL 調(diào)度
接下來绩鸣,來看看Dispatchaer.class.php
,這個類實(shí)現(xiàn)了 URL 的解析、路由和調(diào)度纱兑。
先看dispatch
這個方法呀闻。
獲取與路徑相關(guān)的常量
首先獲取配置中的常量,這些常量定義在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
默認(rèn)為m
,$varAddon
默認(rèn)為a
,$varController
默認(rèn)為c
捡多。這些對應(yīng)的是路徑中路由參數(shù),例如:
http://www.abc.com?m=user&c=user&a=login
是否在兼容模式或 CLI 模式下
是否開啟子域名部署
分析PATHINFO信息
執(zhí)行應(yīng)用
前置/后置操作的實(shí)現(xiàn)
查看如下代碼(位于App.class.php
大概126行前后):
if($class->hasMethod('_before_'.$action)) {
$before = $class->getMethod('_before_'.$action);
if($before->isPublic()) {
$before->invoke($module);
}
}
判斷是否擁有前置方法,例如_before_index()
铐炫。
如果有垒手,利用getMethod
返回這個類方法的 ReflectionMethod 。接著判斷是否公開倒信,然后反射執(zhí)行科贬。
之后執(zhí)行控制器方法:
$method->invoke($module);
后置操作同理,在執(zhí)行控制器方法之后。