摘要:namespace fish; class Route { protected $route = []; protected $pathInfo = []; protecte
namespace fish;
class Route
{
protected $route = [];
protected $pathInfo = [];
protected $params = [];
public function __construct($route)
{
$this->route = $route;
}
//解析路由
public function parse($queryStr='')
{
//1:将查询字符串去掉前后'/',再按分隔符'/'拆分到数组中
$queryStr = trim(strtolower($queryStr), '/');
$queryArr = explode('/', $queryStr);
$queryArr = array_filter($queryArr);
//2:解析出$queryArr数组中的内容(模块[Model],控制器[Controller],操作[Action]与参数[Params])
switch (count($queryArr))
{
//没有参数,则使用默认模块/控制器/操作
case 0:
$this->pathInfo = $this->route;
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,即每四元素起,将剩余元素全部做为操作的参数获取
$paramsArr = array_slice($queryArr,3);
//键值对必须成对出现,所以每次必须递增2
for ($i = 0; $i < count($paramsArr); $i += 2) {
//如果没有第二个参数,则放弃,确保键值一一对应
if (isset($paramsArr[$i+1])) {
$this->params[$paramsArr[$i]] = $paramsArr[$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'];
header('Location: /');
}
// print_r($this->params);
//请用户请求分发到指定控制器的操作上
return call_user_func_array([new $controller, $action], $this->params);
}
}
//测试路由
//准备参数
$queryStr = $_SERVER['QUERY_STRING'];
//引入配置文件并赋值
$config = require __DIR__ . '/config.php';
//实例化并解析路由
$route = new Route($config['route']);
$route->parse($queryStr);
//测试请求分发
require __DIR__ . '/../app/home/controller/Index.php';
echo $route->parse($queryStr)->dispatch();
批改老师:天蓬老师批改时间:2019-01-17 13:39:53
老师总结:你把我写的代码全部复制上来了, 理解了吗?