Route类的register方法调整 路由定义规则调整 增加option参数 可以设置更多匹配条件

This commit is contained in:
thinkphp
2013-04-09 21:25:21 +08:00
parent 10e85046df
commit 279ce15d21

View File

@@ -12,14 +12,7 @@
namespace Think; namespace Think;
class Route { class Route {
// 路由规则 // 路由规则
static private $rules = [ static private $rules = [];
'GET' => [],
'POST' => [],
'PUT' => [],
'DELETE' => [],
'*' => [],
];
// URL映射规则 // URL映射规则
static private $map = []; static private $map = [];
// 子域名部署规则 // 子域名部署规则
@@ -44,43 +37,39 @@ class Route {
} }
// 注册路由规则 // 注册路由规则
static public function register($rule,$route='',$type='GET'){ static public function register($rule,$route='',$option=[]){
if(strpos($type,'|')) { if(is_array($rule)) {
foreach (explode('|',$type) as $val){ foreach ($rule as $key=>$val){
self::register($rule,$route,$val); self::$rules[$key] = ['route'=>$val,'option'=>$option];
} }
}else{ }else{
if(is_array($rule)) { self::$rules[$rule] = ['route'=>$route,'option'=>$option];
self::$rules[$type] = array_merge(self::$rules[$type],$rule);
}else{
self::$rules[$type][$rule] = $route;
}
} }
} }
// 注册任意请求的路由规则 // 注册任意请求的路由规则
static public function any($rule,$route=''){ static public function any($rule,$route='',$option=[]){
self::register($rule,$route,'*'); self::register($rule,$route,array_diff_key($option,['method'=>'']));
} }
// 注册get请求的路由规则 // 注册get请求的路由规则
static public function get($rule,$route=''){ static public function get($rule,$route='',$option=[]){
self::register($rule,$route,'GET'); self::register($rule,$route,array_merge($option,['method'=>'GET']));
} }
// 注册post请求的路由规则 // 注册post请求的路由规则
static public function post($rule,$route=''){ static public function post($rule,$route='',$option=[]){
self::register($rule,$route,'POST'); self::register($rule,$route,array_merge($option,['method'=>'POST']));
} }
// 注册put请求的路由规则 // 注册put请求的路由规则
static public function put($rule,$route=''){ static public function put($rule,$route='',$option=[]){
self::register($rule,$route,'PUT'); self::register($rule,$route,array_merge($option,['method'=>'PUT']));
} }
// 注册delete请求的路由规则 // 注册delete请求的路由规则
static public function delete($rule,$route=''){ static public function delete($rule,$route='',$option=[]){
self::register($rule,$route,'DELETE'); self::register($rule,$route,array_merge($option,['method'=>'DELETE']));
} }
// 检测子域名部署 // 检测子域名部署
@@ -150,12 +139,23 @@ class Route {
return self::parseUrl(self::$map[$regx]); return self::parseUrl(self::$map[$regx]);
} }
// 路由规则检测 // 路由规则检测
$rules = self::$rules[$_SERVER['REQUEST_METHOD']]; if(!empty(self::$rules)) {
if(!empty(self::$rules['*'])) { foreach (self::$rules as $rule=>$val){
$rules = array_merge(self::$rules['*'],$rules); $route = $val['route'];
} $option = $val['option'];
if(!empty($rules)) {
foreach ($rules as $rule=>$route){ // 请求类型检测
if(isset($option['method']) && false === stripos($option['method'],$_SERVER['REQUEST_METHOD'])) {
continue;
}
// 伪静态后缀检测
if(isset($option['ext']) && __EXT__ != $option['ext']) {
continue;
}
// https检测
if(!empty($option['https']) && !self::isSsl()) {
continue;
}
if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正则路由 if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正则路由
if($route instanceof \Closure) { if($route instanceof \Closure) {
// 执行闭包并中止 // 执行闭包并中止
@@ -175,7 +175,7 @@ class Route {
$rule = substr($rule,0,-1); $rule = substr($rule,0,-1);
} }
} }
if($var = self::match($regx,$rule)){ if(false !== $var = self::match($regx,$rule)){
if($route instanceof \Closure) { if($route instanceof \Closure) {
// 执行闭包并中止 // 执行闭包并中止
self::invokeRule($route,$var); self::invokeRule($route,$var);
@@ -191,6 +191,19 @@ class Route {
return self::parseUrl($regx); return self::parseUrl($regx);
} }
/**
* 判断是否SSL协议
* @return boolean
*/
static public function isSsl() {
if(isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))){
return true;
}elseif(isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'] )) {
return true;
}
return false;
}
// 执行正则匹配下的闭包方法 支持参数调用 // 执行正则匹配下的闭包方法 支持参数调用
static private function invokeRegx($closure,$var=[]) { static private function invokeRegx($closure,$var=[]) {
$reflect = new \ReflectionFunction($closure); $reflect = new \ReflectionFunction($closure);