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