本章节总结与练习

原创 2019-01-25 18:46:07 156
摘要://命名空间 namespace tang; class Route{     //路由的配置信息     protected $route = [];     //路由的模块/控制器/操作    
//命名空间
namespace tang;

class Route{
    //路由的配置信息
    protected $route = [];

    //路由的模块/控制器/操作
    public $pathinfo = [];

    //路由的参数
    public $params = [];

    //构造器
    public function __construct($route)
    {
        $this->route = $route;
    }

    //解析路由
    public function parse($queryStr = ""){

        //第一步:切割为数组
        $queryStr = trim(strtolower($queryStr),'/');
        $queryStr = explode('/',$queryStr);
        //$queryStr = array_filter($queryStr);

        //2.解析出数组中的内容
        switch (count($queryStr))
        {
            //如果是空数组就是默认模块,控制器,操作
            case 0:
                $this->pathinfo = $this->route;
                break;
                //有模块,没有控制器和操作
            case 1:
                $this->pathinfo['module'] = $queryStr[0];
                break;
                //有模块,有控制器没有操作
            case 2:
                $this->pathinfo['module'] = $queryStr[0];
                $this->pathinfo['controller'] = $queryStr[1];
                break;
                //有模块,有控制器,有操作
            case 3:
                $this->pathinfo['module'] = $queryStr[0];
                $this->pathinfo['controller'] = $queryStr[1];
                $this->pathinfo['action'] = $queryStr[2];
                break;
                //参数进行处理
            default:
                $this->pathinfo['module'] = $queryStr[0];
                $this->pathinfo['controller'] = $queryStr[1];
                $this->pathinfo['action'] = $queryStr[2];

                //从索引的第三个参数起,每第四个都成对出现
                $arr = array_slice($queryStr,3);
                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\\'.$this->pathinfo['controller'];

        //操作名
        $action = $this->pathinfo['action'];

        //判断下类中是否有操作没有的话,执行默认的方法
        if (!method_exists($controller,$action)){
            $action = $this->route['action'];
            echo '没有操作';
        }

        //用户亲求到指定的控制器操作上
        return call_user_func_array([new $controller,$action],$this->params);
    }
}

$d = $_SERVER['QUERY_STRING'];
//配置文件数组
$route = require 'config.php';
//实例化对象
$route = new Route($route);
//方法
$route->parse($d);
echo "<pre>";
//打印解析出的模块/控制器/方法
print_r($route->pathinfo);
//打印参数
print_r($route->params);

require __DIR__.'/../app/admin/controller/Index.php';
echo $route->dispatch();
namespace app\admin\controller;

class Index{
    public function index($name,$age){
        echo '你好我是Index中的index方法'.'参数name='.$name.' '.'age='.$age;
    }
}

TIM截图20190125184329.jpg

批改老师:查无此人批改时间:2019-01-26 09:20:47
老师总结:完成的不错。像这样的作业,可以写写你对路由的理解。批作业时,可以告诉你哪里不足。继续加油

发布手记

热门词条