#### 路由類
上一章寫了運(yùn)行時要執(zhí)行的一些函數(shù),設(shè)置響應(yīng)頭部等,接下來就要實(shí)例化路由了,這里需要一個路由類``Route``
上一章的``run()``函數(shù)的最后,實(shí)例化了路由類,下面給出路由類的詳細(xì)代碼:
~~~
<?php
namespace S;
class Route{
private $module; //當(dāng)前模塊
private $controller; //當(dāng)前控制器
private $action; //當(dāng)前方法
public function __construct(){
$this->parseUrl();//解析路由,獲得模塊,控制器和操作
$this->newAction(); //實(shí)例化控制器,并執(zhí)行對應(yīng)方法
}
public function parseUrl(){
$this->module = isset($_GET[C('module_name')]) ? $_GET[C('module_name')] : C('default_module');
$this->controller = isset($_GET[C('controller_name')]) ? $_GET[C('controller_name')] : C('default_controller');
$this->action = isset($_GET[C('action_name')]) ? $_GET[C('action_name')] : C('default_action');
}
public function newAction(){
$path = APP_PATH . $this->module . '/Controller/' .$this->controller . 'Controller.php'; //把模塊名和控制器名鏈接成字符串,作為控制器的真實(shí)文件路徑
if (file_exists($path)){ //如果這個文件存在,就通過模塊名和控制器名拼接成命名空間的路徑
$controllerName = '\\' . $this->module . '\\' . $this->controller . 'Controller';
}else{
throw new S_Exception($controllerName . '控制器類文件不存在');
}
if (class_exists($controllerName)){ //然后判斷這個命名空間下的類是否存在,存在的話,就實(shí)例化這個控制器類
$controllerObj = new $controllerName;
}else{
throw new S_Exception($controllerName . '控制器類不存在,請檢查類名或命名空間');
}
if (method_exists($controllerName,$this->action)){ //判斷這個控制器中是否存在這個方法,如果存在的話,就執(zhí)行這個方
$controllerObj->{$this->action}();
}else{
throw new S_Exception($this->action . '方法不存在');
}
}
}
~~~
以上就是這個路由類的代碼,很好理解,首先,在核心運(yùn)行類中new了一個Route類,自動調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)先調(diào)用了``parseUrl()``的解析``url``的方法,先在配置文件中添加如下配置項:
~~~
'module_name' =>'m', //默認(rèn)模塊參數(shù)名 index.php?m=Home&c=Index&a=index
'default_module' =>'Home', //默認(rèn)模塊參數(shù)值
'controller_name' =>'c', //默認(rèn)控制器參數(shù)名
'default_controller'=>'Index', //默認(rèn)控制器參數(shù)值
'action_name'=>'a', //默認(rèn)方法參數(shù)名
'default_action'=>'index', //默認(rèn)方法參數(shù)值
~~~
這樣,在``parseUrl``中,首先用``$_GET[]``分別獲取到當(dāng)前的模塊、控制器、方法的值,如果url中沒有,就使用默認(rèn)的配置文件中的值,并把它賦值給相應(yīng)的變量。
然后,構(gòu)造函數(shù)又調(diào)用了``newAction()``方法,把獲取到的這三個值拼接成控制器文件的字符串路徑,如果這個路徑對應(yīng)的文件存在,那就再次根據(jù)模塊名和控制器名,拼接出這個控制器的命名空間,然后去判斷這個命名空間下是否存在這個類,如果存在,證明我們找到了這個類,就去實(shí)例化這個類,實(shí)例化之后,就去判斷這個類中是否存在需要調(diào)用的方法,如果存在,那么就正式的去調(diào)用這個類,至此,整個PHP執(zhí)行流程結(jié)束。
#### 很簡單吧?其實(shí)把框架掰開了揉碎了看,就那么幾個步驟,只要自己試著寫寫,很容易就明白的
##### 上面的代碼中用到了``S_Exception``類,這是一個自定義的異常類,下一節(jié)會講到。