亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

路由類,從url到類方法的映射

asal 2019-03-06 14:45:35 200
abstrak:<?php /*路由解析類 1.路由解析 2.請求分發(fā)*/ namespace pig; class Route { //路由信息 protected $route = []; //PATHINFO protected $pathInfo = []; //url參數(shù) protected 
<?php
/*路由解析類
1.路由解析
2.請求分發(fā)*/

namespace pig;

class Route
{
	//路由信息
	protected $route = [];
	//PATHINFO
	protected $pathInfo = [];
	//url參數(shù)
	protected $params = [];
	//構(gòu)造方法初始化路由信息,給默認(rèn)值
	public function __construct($route)
	{
		$this->route = $route;
	}
	//解析路由
	public function parse($queryStr='')
	{
		//第一步:將查詢的字符串前后的/去掉,再按分隔符拆分到數(shù)組中
		$queryStr = trim(strtolower($queryStr),'/');
		//分割成數(shù)組
		$queryArr = explode('/', $queryStr);
		//過濾掉非法字符
		$queryArr = array_filter($queryArr);
		//第二步:解析出$queryArr數(shù)組中的內(nèi)容(模塊,控制器,操作,參數(shù))
		switch(count($queryArr))
		{
			//沒有參數(shù),則使用默認(rèn)的模塊、控制器、操作
			case 0:
				$this->pathInfo=$this->route;
				break;
			//只有一個參數(shù):用戶提供了模塊,那么控制器和操作就使用默認(rèn)值
			case 1:
				$this->pathInfo['module']=$queryArr[0];	
				break;
			//有兩個參數(shù),模塊和控制器,那么操作就用默認(rèn)值
			
				$this->pathInfo['module']=$queryArr[0];	
				$this->pathInfo['controller']=$queryArr[1];	
				break;
			//有三個參數(shù)
			    $this->pathInfo['module']=$queryArr[0];
				$this->pathInfo['controller']=$queryArr[1];	
				$this->pathInfo['action']=$queryArr[2];	
				break;
				//對參數(shù)進(jìn)行處理
			default:	
				$this->pathInfo['module']=$queryArr[0];
				$this->pathInfo['controller']=$queryArr[1];	
				$this->pathInfo['action']=$queryArr[2];
				//從pathinfo數(shù)組的索引3開始,將剩余的元素全部作為參數(shù)處理
				$arr=array_slice($queryArr,3);
				//鍵值必須成對出現(xiàn),所以每次遞增為2
				for($i=0;$i<count($arr);$i=+2){
					//如果沒有第二個參數(shù)(不成對,有一個單的,判斷后面一個值是否存在就行),則放棄
					if(isset($arr[$i+1])){
						$this->params[$arr[$i]] = $arr[$i+1];
					}
				}
		}
		//返回當(dāng)前路由類的實例對象,主要是方便鏈?zhǔn)秸{(diào)用:$route->parse()->worm()->print(),相當(dāng)于對象調(diào)用方法,只是省略了對象
		return $this;
	}
    
	//請求分發(fā)
	public function dispath()
	{
		//生成的帶有命名空間的控制器名稱:app\模塊\controller\控制器類
		//類名稱應(yīng)該與類文件所在的絕對路徑一一對應(yīng),這樣才可以實現(xiàn)自動映射,方便自動加載
		//模塊名稱
		$module = $this->pathInfo['module'];
		//控制器名稱(帶命名空間的)\\多的一個是轉(zhuǎn)義用的,
		$controller = '\app\\'.$module.'\controller\\'.ucfirst($this->pathInfo['controller']);//首字母大寫
		die($controller);
		//操作名
		$action = $this->pathInfo['action'];
		if(!method_exists($controller, $action)){//判斷類中是否存在方法
			$action = $this->route['action'];
		     //重定向到首頁
		     header('Location:/');
		}
		//將用戶的請求分發(fā)到指定的控制器和對應(yīng)的操作方法上
		call_user_func_array([new $controller,$action], $this->params);
	}
}

//測試路由
$queryStr = $_SERVER['QUERY_STRING'];
//echo $queryStr;
//加載配置
$config = require 'config.php';
$route = new Route($config['route']);
$route->parse($queryStr);
/*echo '<br/>';
print_r($route->pathInfo);
echo '<br/>';
print_r($route->params);*/
//加載類文件
require __DIR__.'/../app/admin/controller/Index.php';
$route->dispath();


Guru membetulkan:韋小寶Masa pembetulan:2019-03-06 15:45:45
Rumusan guru:路由還是比較重要的 關(guān)系的一些安全問題 后期記得要運用到實際的開發(fā)中去哦

Nota Keluaran

Penyertaan Popular