路由解析和请求分发操作

Original 2019-01-26 11:00:15 456
abstract:

/**
* 路由解析
* 请求分发
*/

namespace devin;


class Route
{
//路由信息
public $route =[];
//pathinfo
public $pathInfo = [];
//URL参数
public $params = [];
//构造方法
public function __construct($route)
{
//路由器配置初始化
$this->route =$route;
}
//解析路由
public function parse($queryStr='')
{
//第一步 吧查询到的字符串前后的/.去掉
$queryStr=trim(strtolower($queryStr),'/');
$queryArr = explode('/',$queryStr);
$queryArr = array_filter($queryArr);

//第二步 借东西出来$queryArr数组中的内容(模块,控制器,操作,参数)
switch (count($queryArr)){
//没有参数 使用默认模块/控制器/操作
case 0:
$this->pathInfo;
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
for ($i=0;$i//如果没有第二个参数 则放弃
if (isset($arr[$i+1])){
$this->params[$arr[$i]] = $arr[$i+1];
}
}
break;
}
//返回当前路由实列对象
return $this;
}
//请求分发
public function dispatch()
{
//生成带有命名空间的控制器类名称:app\模块\controller\控制器类
//类名称应该与类文件所在的绝对路径对应 才可以实现自动映射 方便自动加载
//模块名称
$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: /');
}
//将用户的请求分发到指定的控制器和对应的操作方法上
return call_user_func_array([new $controller,$action],$this->params);
}
}
$queryStr = $_SERVER['QUERY_STRING'];
//echo $queryStr;
//print_r(explode('/',$queryStr));
$config = require 'config.php';
$route = new Route($config['route']);
$route->parse($queryStr);
require __DIR__.'/../app/admin/controller/Index.php';
echo $route->dispatch();

Correcting teacher:韦小宝Correction time:2019-01-26 13:14:45
Teacher's summary:写的很不错 路由在开发中很重要的 它决定了网站的安全性 一定要多研究哦

Release Notes

Popular Entries