abstract: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();
Correcting teacher:韦小宝Correction time:2019-02-28 09:18:43
Teacher's summary:写的很棒 路由对于一个项目来说还是比较重要的 它关系的安全性