路由解析和请求分发操作

原创2019-01-26 11:00:15323
摘要:<?php/** * 路由解析 * 请求分发 */namespace devin;class Route{      //路由信息    public $route =[];    //pathinfo    public $pathInfo = [];    //URL参数 &nb

<?php
/**
* 路由解析
* 请求分发
*/

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<count($arr);$i+=2){
               //如果没有第二个参数 则放弃
               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();

批改老师:韦小宝批改时间:2019-01-26 13:14:45
老师总结:写的很不错 路由在开发中很重要的 它决定了网站的安全性 一定要多研究哦

发布手记

热门词条