参照教程自己写的路由类实现URL到类方法的映射

原创2019-02-27 19:21:03143
摘要: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();


333333.png

批改老师:韦小宝批改时间:2019-02-28 09:18:43
老师总结:写的很棒 路由对于一个项目来说还是比较重要的 它关系的安全性

发布手记

热门词条