将url进行解析和分发

原创 2019-02-01 21:40:58 381
摘要:<?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请求到类方法的映射

发布手记

热门词条