摘要:<?phpclass Route{ //定义三个空数组 protected $route = []; protected $pathinfo = []; protected $params = []; public function _construct($route){ //构造函数在调用Route类时会自动初始化默认的route值 $this->route = $ro
<?php
class Route{
//定义三个空数组
protected $route = [];
protected $pathinfo = [];
protected $params = [];
public function _construct($route){ //构造函数在调用Route类时会自动初始化默认的route值
$this->route = $route;
}
//$querystr通过系统函数$_SERVER['QUERY_STRING']获得,解析获得url地址的pathinfo和params
//因为pathinfo和params是连在一起的数据,所以需对获得的数据进行处理
public function parse($querystr){
$querystr = trim(strtolower($quertstr),'/'); //将获得的数据全部小写并去掉左右的/
$queryarr = explode('/','$querystr'); //用explode函数将已/分开的数据转化为数组
switch(count($querystr)){
case 0:
$this->pathinfo = $this->route; //pathinfo全部为默认的$route
break;
case 1:
$this->pathinfo['module'] = ($queryarr[0]); //只有第一个模块
break;
case 2:
$this->pathinfo['module'] = ($queryarr[0]); //有前两个模块和控制器
$this->pathinfo['controller'] = ($queryarr[1]);
case 3:
$this->pathinfo['module'] = ($queryarr[0]); //有模块、控制器和控制器类中操作方法三个
$this->pathinfo['controller'] = ($queryarr[1]);
$this->pathinfo['cation'] = ($queryarr[2]);
break;
default:
$this->pathinfo['module'] = ($queryarr[0]); //不仅有模块、控制器和控制器类中操作方法三个, 还有参数
$this->pathinfo['controller'] = ($queryarr[1]);
$this->pathinfo['cation'] = ($queryarr[2]);
//对参数进行处理,参数是从数组的第四个元素开始的,取索引3以后的元素
$arr = array_slice($queryarr,3);
//参数是两个元素为一组键值对,所以每次递增2
for($i = 3;$i < count($arr);$i += 2){
if(isset($arr[$i+1])){ //两个索引数组的值为一组组合成键值对数组
$this->params[$arr[$i]] = $arr[$arr[$i+1]];
}
}
break;
}
}
//请求分发,主要是将用户请求的解析的模块,控制器,操作赋值,并通过call_user_func_array()函数将用户的请求进行处理反馈
public function dispatch(){
$module = $this->pathinfo['module'];
$controller = 'app\\'.$module.'\controller\\'ucfirst($this->pathinfo['controller']);
$cation = $this->$this->pathinfo['cation'];
if(!method_exists($controller,$action)){ //在控制器和操作不存在时,进行默认操作,返回首页
$action = $this->route['action'];
header('location:/');
return call_user_func_array([new $controller,$action],$this->params);
}
}
我的理解是用户发送一个url,对url拆分为模块,控制器,操作和参数,然后对模块,控制器,操作的存在情况进行分类讨论,不存在的给一个默认值,然后将剩下的参数按两两对应组成键值对数组,这是解析。分发为解析出来的控制器,操作等通过系统函数处理并将相对应的文件和内容反馈给用户
批改老师:天蓬老师批改时间:2019-02-02 11:55:27
老师总结:简单讲, 就是一个url请求到类方法的映射