摘要:class Route{ //路由配置模块 // protected $route=[]; public $route=[]; //PATHINO // protected $pathInfo=[]; &nb
class Route{
//路由配置模块
// protected $route=[];
public $route=[];
//PATHINO
// protected $pathInfo=[];
public $pathInfo=[];
//参数
// protected $params=[];
public $params=[];
public function __construct($route){
//路由初始化配置
return $this->route=$route;
}
//解析路由
public function parse($queryString=''){
$queryString=trim($queryString,'/');//将获得的字符串去掉斜杠 /admin/user/show/add
$queryArr=explode('/',$queryString); //将去掉斜杠的字符串进行切割
// $queryArr=array_filter($queryArr);//过滤0
//解析出$queryArr数组中的内容(模块,控制器,操作,参数)
switch (count($queryArr)){
case 0;//数组中没有参数的情况。地址默认为当前地址
$this->pathInfo=$this->route;
break;
case 1;//数组中只有一个参数的情况
$this->pathInfo['model']=$queryArr[0];
break;
case 2;//2个参数,模块和控制器是自定义的,操作是默认的。
$this->pathInfo['model']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
break;
case 3;//3个参数。模块,控制器,操作全部自定义:全部来自用户对实际请求
$this->pathInfo['model']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
$this->pathInfo['action']=$queryArr[2];
break;
//如果是非法或者是不存在的访问,对参数进行处理
default;
$this->pathInfo['model']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
$this->pathInfo['action']=$queryArr[2];
//从pathInfo的数组3开始索引,将剩余的元素全部作为参数进行处理
$arr=array_slice($queryArr,3);
for($i=0;$i<count($arr);$i+=2){
if(isset($arr[$i+1])){//如果数组中没有第二个参数则放弃
$this->params[$arr[$i]]=$arr[$i+1];
}
}
break;
}
//返回当前路由的实例对象,主要是方便链式调用:$route->parse()->worm()->print()
return $this;
}
//请求分发
public function dispatch(){
//生成的带有命名空间的控制器类名称:app\模块\controller\控制器类
//类名称应该与类文件所在的绝对路径一一对应,这样才可以实现自动映射,方便自动加载
//获取模块名称
$module=$this->pathInfo['model'];
//获取控制器名称
$controller='app\\'.$module.'\\controller\\'.ucfirst($this->pathInfo["controller"]);
//获取操作
$action=$this->pathInfo['action'];
if(!method_exists($controller,$action)){
$action=$this->pathInfo['action'];
header('Location: /');
}
//将用户请求分发到指定到控制和操作方法上
return call_user_func_array([new $controller,$action],$this->params);
}
//获取pathInfo
public function getPathInfo(){
return $this->pathInfo;
}
//获取模块
public function getModel(){
return $this->pathInfo['model']? :$this->route['module'];
}
//获取控制器名称
public function getController(){
$controller='app\\'.$this->getModel().'\\controller\\'.ucfirst($this->pathInfo["controller"]);
}
}
//测试路由器
echo $queryString=$_SERVER['QUERY_STRING'];
echo '<hr>';
echo $queryString=trim($queryString,'/');
echo'<hr>';
print_r($queryArr=explode('/',$queryString));
echo'<hr>';
echo'<pre>';
$config=require __DIR__.'/config.php';
$rote=new Route($config['route']);
$rote->parse($queryString);
echo'<hr>';
//测试请求分发
require __DIR__.'/../app/admin/controller/Index.php';
echo $rote->dispatch();
批改老师:韦小宝批改时间:2019-02-28 09:18:43
老师总结:写的很棒 路由对于一个项目来说还是比较重要的 它关系的安全性