摘要:<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/6/9 * Time: 2:18 */ namespace pig; use app\a
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/6/9 * Time: 2:18 */ namespace pig; use app\admin\controller\Index; /** * Class router 路由解析類 * @package pig * 1 路由解析 模塊/控制器/操作方法/參數(shù) * 2 請求分發(fā) 使用命名空間 自動映射到具體的類中 ,然后將參數(shù)傳進(jìn)去處理 重點理解 call_user_func_array函數(shù) */ class router { // 路由信息 public $route = []; //pathInfo 參數(shù) public $pathInfo = []; // url 參 protected 繼承類 自己 同一個包的類 都可訪問 //protected $params = []; public $params = []; // 構(gòu)造方法 public function __construct($route){ // 路由 配置初始化 $this->route = $route; } // 解析 路由 public function parse($queryStr = ''){ // /admin/user/add/name/peter/age/30 // ['module'=>'admin','controller'=>'user','action'=>'add'] 模塊, 控制器 , 操作方法 // 參數(shù) ['name'=>'peter','age'=>'30'] //第一步 去除多余字符,切割數(shù)組,過濾數(shù)組 處理邏輯 , 將前后的/ 去掉 $queryStr = trim($queryStr,'/'); $queryArr = explode('/',$queryStr); // 過濾 數(shù)組 ,過濾掉空值 $queryArr = array_filter($queryArr); //第二步 根據(jù)數(shù)組 解析出的 模塊 , 控制器 ,操作 , 參數(shù) $num = count($queryArr); switch($num) { // 沒有參數(shù) 則為默認(rèn)的 case 0: // 則為配置信息的默認(rèn) 模塊, 控制器 ,操作 $this->pathInfo = $this->route; break; // 1個參數(shù) 表示 ??? case 1: $this->pathInfo['module'] = $queryArr[0]; break; // 2 個參數(shù) 表示 模塊 , 控制器 case 2: $this->pathInfo['module'] = $queryArr[0]; $this->pathInfo['controller'] = $queryArr[1]; break; // 3 個參數(shù) 表示 模塊 , 控制器 , 操作 case 3: $this->pathInfo['module'] = $queryArr[0]; $this->pathInfo['controller'] = $queryArr[1]; $this->pathInfo['action'] = $queryArr[2]; break; // 其他參數(shù) 表示 可 解析參數(shù) default : $this->pathInfo['module'] = $queryArr[0]; $this->pathInfo['controller'] = $queryArr[1]; $this->pathInfo['action'] = $queryArr[2]; // 去除多余參數(shù) $num -= ($num - 3) % 2 == 0 ? 0 : 1; // 索引從3 開始 for ($i = 3; $i < $num; $i += 2) { $this->params[$queryArr[$i]] = $queryArr[$i + 1]; } break; } } // 請求分發(fā) public function dispatch(){ // 生成帶有命名空間的控制器類稱: app\模塊\controller\控制器\action\操作方法 // 類名稱應(yīng)該與類文件一一對應(yīng) , 這樣方便自動映射,實現(xiàn)自動加載 例: 模塊\admin\控制器controller\index 操作方法\add 為 index.php(控制器文件中的函數(shù)) // 模塊名稱 $module = $this->pathInfo['module']; // 控制器 $controller = 'app\\'.$module.'\controller\\'.$this->pathInfo['controller']; // 操作方法 $action = $this->pathInfo['action']; // 檢查一個類的是否存在于該方法 ,如果沒有則 默認(rèn)的路由 if(!method_exists($controller,$action) ){ $action = $this->route['action']; // 設(shè)置表頭跳轉(zhuǎn) echo "沒有該方法,進(jìn)行表頭跳轉(zhuǎn)"; //header('Location:/'); return false; } // 使用 call_user_func_array 映射 到控制器中 return call_user_func_array([new $controller,$action],$this->params); } // 返回參數(shù) public function getPrams(){ return $this->params; } } // 測試路由 $queryStr = $_SERVER['QUERY_STRING']; echo "<h2>".$queryStr."<hr></h2><pre>"; // 加載配置信息 $config = require __DIR__."/config.php"; $rou = new router($config['route']); $rou->parse($queryStr); echo "打印??煨畔?quot;; print_r($rou->pathInfo); echo "打印參數(shù)信息"; print_r($rou->params); // 加載模塊 require __DIR__."/../app/admin/controller/index.php"; echo "<h1>控制器名稱為:</h1>"; print_r($rou->dispatch());
批改老師:查無此人批改時間:2019-06-11 09:19:21
老師總結(jié):完成的不錯。理解一些理論知識,會讓你代碼寫的更好。繼續(xù)加油