abstract:<?php /** * 实现URL到类方法的映射 */ namespace pig; class Route { //配置路由信息 protected $route = []; &nbs
<?php /** * 实现URL到类方法的映射 */ namespace pig; class Route { //配置路由信息 protected $route = []; //PATHINFO protected $pathInfo = []; //URL参数 protected $params = []; //构造方法 public function __construct($route) { //路由初始配置 $this->route = $route; } //路由解析 public function parse($queryStr='') { //第一步:将字符床前后/去掉,再按分隔符/拆分到数组中去 $queryStr = strtolower(trim($queryStr,'/')); $queryArr = explode('/',$queryStr); //第二步:解析出$queryArr数组中的内容(模块,控制器,操作,参数) 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开始,将剩余的元素全部作为参数进行处理 $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; } //返回当前路由的实例对象,主要是方便链式调用:$route->parse()->worm()->print() 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); } //获取pathInfo public function getPathInfo() { return $this->pathInfo; } //获取模块 public function getModule() { return $module = $this->pathInfo['module'] ? : $this->route['module']; } //获取控制器 public function getController() { return 'app\\' . $this->getModule() . '\controller\\' . ucfirst($this->pathInfo['controller']); } }
Correcting teacher:查无此人Correction time:2019-06-10 09:08:40
Teacher's summary:完成的不错。很多框架都是这样作的,学习原理,更好的理解编程。继续加油