abstrak:<?php // 路由解析類 namespace Pigs; class Routes { // 默認路由 protected $route = []; // pa
<?php // 路由解析類 namespace Pigs; class Routes { // 默認路由 protected $route = []; // pathInfo 信息 protected $pathInfo = []; // Url參數 protected $params = []; // 創(chuàng)建構造方法 public function __construct($route) { $this->route = $route; } // 解析路由 public function parse($queryStr='') { // 處理字符串信息,去掉左右兩邊的/ 并把字母全部轉換成小寫 $queryStr = trim(strtolower($queryStr),'/'); // 將字符串分割成數組 $queryArr = explode('/',$queryStr); // 判斷解析的數組個數,獲?。K,控制器,操作,參數) switch(count($queryArr)) { // 如果為0 則使用默認路由 case 0: $this->pathInfo = $this->route; break; case 1: // 只有一個數組時,取回的就是模塊 $this->pathInfo['module'] = $queryArr[0]; break; case 2: $this->pathInfo['module'] = $queryArr[0];// 模塊 $this->pathInfo['controller'] = $queryArr[1];// 控制器 break; case 3: $this->pathInfo['module'] = $queryArr[0];// 模塊 $this->pathInfo['controller'] = $queryArr[1];// 控制器 $this->pathInfo['action'] = $queryArr[2];// 操作 break; default :// 默認情況 $this->pathInfo['module'] = $queryArr[0];// 模塊 $this->pathInfo['controller'] = $queryArr[1];// 控制器 $this->pathInfo['action'] = $queryArr[2];// 操作 // 從pathInfo數組的索引3開始,將剩余的元素全部作為參數處理 $arr = array_slice($queryArr,3); // 鍵值對必須成對出現,所以每次遞增為2 $count = count($arr); for($i=0;$i<$count;$i+=2) { // 如果沒有第二個參數,則放棄 if(isset($arr[$i+1])) { $this->params[$arr[$i]] = $arr[$i+1]; } } break; } // 返回當前路由的實例對象,主要是方便鏈式調用:$route->parse return $this; } // 請求分發(fā) public function dispatch() { // 獲取模塊 $module = $this->pathInfo['module']; // 獲取控制器 拼接路徑,給控制器首字母轉換大寫 $controller = 'app\\'.$module.'\controller\\'.ucfirst($this->pathInfo['controller']); // 獲取操作 $action = $this->pathInfo['action']; // 判斷是否存在類中的操作方法 if(!method_exists($controller,$action)) { // 不存在 則使用默認操作 $action = $this->route['action']; // 重定向 header('Location:/'); } // 使用call_user_func_array(); 將用戶的請求分發(fā)到指定的控制器和方法上 return call_user_func_array([new $controller,$action],$this->params); } // 獲取pathInfo public function getPathInfo() { return $this->pathInfo; } // 獲取模塊 public function getModule() { return $this->pathInfo['module']; } // 獲取控制器名稱 public function getController() { return 'app\\'.$this->getModule().'\controller\\'.ucfirst($this->pathInfo['controller']); } } // 獲取地址信息 $queryStr = $_SERVER['QUERY_STRING']; // 導入路由信息 $config = require 'config.php'; // 傳入默認路由 $route = new Routes($config['route']); echo '<pre>'; $rs = $route->parse($queryStr); require __DIR__.'/../app\admin\controller\Index.php'; // 測試請求分發(fā) print_r($rs->dispatch()); ?>
Guru membetulkan:天蓬老師Masa pembetulan:2019-04-14 22:03:32
Rumusan guru:這個課程是我錄制, 如果我沒記錯, 你應該是把教學源碼直接復制過來發(fā)布的, 不知你是否明白了原理, 至少要寫點學習體會吧....
為了不影響后面的學習, 這次先通過, 下次不要這么隨意了