|
@@ -2,7 +2,7 @@
|
|
|
// +----------------------------------------------------------------------
|
|
// +----------------------------------------------------------------------
|
|
|
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
|
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
|
|
// +----------------------------------------------------------------------
|
|
// +----------------------------------------------------------------------
|
|
|
-// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
|
|
|
|
|
|
|
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
|
|
// +----------------------------------------------------------------------
|
|
// +----------------------------------------------------------------------
|
|
|
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
|
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
|
|
// +----------------------------------------------------------------------
|
|
// +----------------------------------------------------------------------
|
|
@@ -68,8 +68,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册变量规则
|
|
* 注册变量规则
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string|array $name 变量名
|
|
|
|
|
- * @param string $rule 变量规则
|
|
|
|
|
|
|
+ * @param string|array $name 变量名
|
|
|
|
|
+ * @param string $rule 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function pattern($name = null, $rule = '')
|
|
public static function pattern($name = null, $rule = '')
|
|
@@ -84,10 +84,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册子域名部署规则
|
|
* 注册子域名部署规则
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string|array $domain 子域名
|
|
|
|
|
- * @param mixed $rule 路由规则
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $domain 子域名
|
|
|
|
|
+ * @param mixed $rule 路由规则
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function domain($domain, $rule = '', $option = [], $pattern = [])
|
|
public static function domain($domain, $rule = '', $option = [], $pattern = [])
|
|
@@ -121,8 +121,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置路由绑定
|
|
* 设置路由绑定
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param mixed $bind 绑定信息
|
|
|
|
|
- * @param string $type 绑定类型 默认为module 支持 namespace class controller
|
|
|
|
|
|
|
+ * @param mixed $bind 绑定信息
|
|
|
|
|
+ * @param string $type 绑定类型 默认为module 支持 namespace class controller
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
public static function bind($bind, $type = 'module')
|
|
public static function bind($bind, $type = 'module')
|
|
@@ -133,8 +133,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置或者获取路由标识
|
|
* 设置或者获取路由标识
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string|array $name 路由命名标识 数组表示批量设置
|
|
|
|
|
- * @param array $value 路由地址及变量信息
|
|
|
|
|
|
|
+ * @param string|array $name 路由命名标识 数组表示批量设置
|
|
|
|
|
+ * @param array $value 路由地址及变量信息
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function name($name = '', $value = null)
|
|
public static function name($name = '', $value = null)
|
|
@@ -154,7 +154,7 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 读取路由绑定
|
|
* 读取路由绑定
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $type 绑定类型
|
|
|
|
|
|
|
+ * @param string $type 绑定类型
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
public static function getBind($type)
|
|
public static function getBind($type)
|
|
@@ -165,8 +165,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 导入配置文件的路由规则
|
|
* 导入配置文件的路由规则
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param array $rule 路由规则
|
|
|
|
|
- * @param string $type 请求类型
|
|
|
|
|
|
|
+ * @param array $rule 路由规则
|
|
|
|
|
+ * @param string $type 请求类型
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function import(array $rule, $type = '*')
|
|
public static function import(array $rule, $type = '*')
|
|
@@ -222,16 +222,17 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册路由规则
|
|
* 注册路由规则
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param string $type 请求类型
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param string $type 请求类型
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = [])
|
|
public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = [])
|
|
|
{
|
|
{
|
|
|
$group = self::getGroup('name');
|
|
$group = self::getGroup('name');
|
|
|
|
|
+
|
|
|
if (!is_null($group)) {
|
|
if (!is_null($group)) {
|
|
|
// 路由分组
|
|
// 路由分组
|
|
|
$option = array_merge(self::getGroup('option'), $option);
|
|
$option = array_merge(self::getGroup('option'), $option);
|
|
@@ -254,9 +255,11 @@ class Route
|
|
|
$option1 = array_merge($option, $val[1]);
|
|
$option1 = array_merge($option, $val[1]);
|
|
|
$pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
|
|
$pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
|
|
|
} else {
|
|
} else {
|
|
|
- $route = $val;
|
|
|
|
|
|
|
+ $option1 = null;
|
|
|
|
|
+ $pattern1 = null;
|
|
|
|
|
+ $route = $val;
|
|
|
}
|
|
}
|
|
|
- self::setRule($key, $route, $type, isset($option1) ? $option1 : $option, isset($pattern1) ? $pattern1 : $pattern, $group);
|
|
|
|
|
|
|
+ self::setRule($key, $route, $type, !is_null($option1) ? $option1 : $option, !is_null($pattern1) ? $pattern1 : $pattern, $group);
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
self::setRule($rule, $route, $type, $option, $pattern, $group);
|
|
self::setRule($rule, $route, $type, $option, $pattern, $group);
|
|
@@ -267,12 +270,12 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置路由规则
|
|
* 设置路由规则
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param string $type 请求类型
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
- * @param string $group 所属分组
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param string $type 请求类型
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
|
|
+ * @param string $group 所属分组
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
protected static function setRule($rule, $route, $type = '*', $option = [], $pattern = [], $group = '')
|
|
protected static function setRule($rule, $route, $type = '*', $option = [], $pattern = [], $group = '')
|
|
@@ -304,8 +307,12 @@ class Route
|
|
|
}
|
|
}
|
|
|
$vars = self::parseVar($rule);
|
|
$vars = self::parseVar($rule);
|
|
|
if (isset($name)) {
|
|
if (isset($name)) {
|
|
|
- $key = $group ? $group . ($rule ? '/' . $rule : '') : $rule;
|
|
|
|
|
- self::name($name, [$key, $vars, self::$domain]);
|
|
|
|
|
|
|
+ $key = $group ? $group . ($rule ? '/' . $rule : '') : $rule;
|
|
|
|
|
+ $suffix = isset($option['ext']) ? $option['ext'] : null;
|
|
|
|
|
+ self::name($name, [$key, $vars, self::$domain, $suffix]);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (isset($option['modular'])) {
|
|
|
|
|
+ $route = $option['modular'] . '/' . $route;
|
|
|
}
|
|
}
|
|
|
if ($group) {
|
|
if ($group) {
|
|
|
if ('*' != $type) {
|
|
if ('*' != $type) {
|
|
@@ -328,9 +335,9 @@ class Route
|
|
|
if ('*' == $type) {
|
|
if ('*' == $type) {
|
|
|
// 注册路由快捷方式
|
|
// 注册路由快捷方式
|
|
|
foreach (['get', 'post', 'put', 'delete', 'patch', 'head', 'options'] as $method) {
|
|
foreach (['get', 'post', 'put', 'delete', 'patch', 'head', 'options'] as $method) {
|
|
|
- if (self::$domain) {
|
|
|
|
|
|
|
+ if (self::$domain && !isset(self::$rules['domain'][self::$domain][$method][$rule])) {
|
|
|
self::$rules['domain'][self::$domain][$method][$rule] = true;
|
|
self::$rules['domain'][self::$domain][$method][$rule] = true;
|
|
|
- } else {
|
|
|
|
|
|
|
+ } elseif (!self::$domain && !isset(self::$rules[$method][$rule])) {
|
|
|
self::$rules[$method][$rule] = true;
|
|
self::$rules[$method][$rule] = true;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -341,7 +348,7 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置当前执行的参数信息
|
|
* 设置当前执行的参数信息
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param array $options 参数信息
|
|
|
|
|
|
|
+ * @param array $options 参数信息
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
protected static function setOption($options = [])
|
|
protected static function setOption($options = [])
|
|
@@ -362,7 +369,7 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 获取当前的分组信息
|
|
* 获取当前的分组信息
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $type 分组信息名称 name option pattern
|
|
|
|
|
|
|
+ * @param string $type 分组信息名称 name option pattern
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
public static function getGroup($type)
|
|
public static function getGroup($type)
|
|
@@ -377,9 +384,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置当前的路由分组
|
|
* 设置当前的路由分组
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $name 分组名称
|
|
|
|
|
- * @param array $option 分组路由参数
|
|
|
|
|
- * @param array $pattern 分组变量规则
|
|
|
|
|
|
|
+ * @param string $name 分组名称
|
|
|
|
|
+ * @param array $option 分组路由参数
|
|
|
|
|
+ * @param array $pattern 分组变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function setGroup($name, $option = [], $pattern = [])
|
|
public static function setGroup($name, $option = [], $pattern = [])
|
|
@@ -392,10 +399,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册路由分组
|
|
* 注册路由分组
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string|array $name 分组名称或者参数
|
|
|
|
|
- * @param array|\Closure $routes 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $name 分组名称或者参数
|
|
|
|
|
+ * @param array|\Closure $routes 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function group($name, $routes, $option = [], $pattern = [])
|
|
public static function group($name, $routes, $option = [], $pattern = [])
|
|
@@ -423,7 +430,8 @@ class Route
|
|
|
self::$rules['*'][$name]['pattern'] = $pattern;
|
|
self::$rules['*'][$name]['pattern'] = $pattern;
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
- $item = [];
|
|
|
|
|
|
|
+ $item = [];
|
|
|
|
|
+ $completeMatch = Config::get('route_complete_match');
|
|
|
foreach ($routes as $key => $val) {
|
|
foreach ($routes as $key => $val) {
|
|
|
if (is_numeric($key)) {
|
|
if (is_numeric($key)) {
|
|
|
$key = array_shift($val);
|
|
$key = array_shift($val);
|
|
@@ -442,12 +450,15 @@ class Route
|
|
|
// 是否完整匹配
|
|
// 是否完整匹配
|
|
|
$options['complete_match'] = true;
|
|
$options['complete_match'] = true;
|
|
|
$key = substr($key, 0, -1);
|
|
$key = substr($key, 0, -1);
|
|
|
|
|
+ } elseif ($completeMatch) {
|
|
|
|
|
+ $options['complete_match'] = true;
|
|
|
}
|
|
}
|
|
|
$key = trim($key, '/');
|
|
$key = trim($key, '/');
|
|
|
$vars = self::parseVar($key);
|
|
$vars = self::parseVar($key);
|
|
|
$item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns];
|
|
$item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns];
|
|
|
// 设置路由标识
|
|
// 设置路由标识
|
|
|
- self::name($route, [$name . ($key ? '/' . $key : ''), $vars, self::$domain]);
|
|
|
|
|
|
|
+ $suffix = isset($options['ext']) ? $options['ext'] : null;
|
|
|
|
|
+ self::name($route, [$name . ($key ? '/' . $key : ''), $vars, self::$domain, $suffix]);
|
|
|
}
|
|
}
|
|
|
self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern];
|
|
self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern];
|
|
|
}
|
|
}
|
|
@@ -476,10 +487,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册路由
|
|
* 注册路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function any($rule, $route = '', $option = [], $pattern = [])
|
|
public static function any($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -490,10 +501,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册GET路由
|
|
* 注册GET路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function get($rule, $route = '', $option = [], $pattern = [])
|
|
public static function get($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -504,10 +515,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册POST路由
|
|
* 注册POST路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function post($rule, $route = '', $option = [], $pattern = [])
|
|
public static function post($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -518,10 +529,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册PUT路由
|
|
* 注册PUT路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function put($rule, $route = '', $option = [], $pattern = [])
|
|
public static function put($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -532,10 +543,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册DELETE路由
|
|
* 注册DELETE路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function delete($rule, $route = '', $option = [], $pattern = [])
|
|
public static function delete($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -546,10 +557,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册PATCH路由
|
|
* 注册PATCH路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function patch($rule, $route = '', $option = [], $pattern = [])
|
|
public static function patch($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -560,10 +571,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册资源路由
|
|
* 注册资源路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string|array $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function resource($rule, $route = '', $option = [], $pattern = [])
|
|
public static function resource($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -607,10 +618,10 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册控制器路由 操作方法对应不同的请求后缀
|
|
* 注册控制器路由 操作方法对应不同的请求后缀
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function controller($rule, $route = '', $option = [], $pattern = [])
|
|
public static function controller($rule, $route = '', $option = [], $pattern = [])
|
|
@@ -623,9 +634,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册别名路由
|
|
* 注册别名路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string|array $rule 路由别名
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
|
|
+ * @param string|array $rule 路由别名
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function alias($rule = null, $route = '', $option = [])
|
|
public static function alias($rule = null, $route = '', $option = [])
|
|
@@ -640,8 +651,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 设置不同请求类型下面的方法前缀
|
|
* 设置不同请求类型下面的方法前缀
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $method 请求类型
|
|
|
|
|
- * @param string $prefix 类型前缀
|
|
|
|
|
|
|
+ * @param string $method 请求类型
|
|
|
|
|
+ * @param string $prefix 类型前缀
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function setMethodPrefix($method, $prefix = '')
|
|
public static function setMethodPrefix($method, $prefix = '')
|
|
@@ -656,8 +667,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* rest方法定义和修改
|
|
* rest方法定义和修改
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $name 方法名称
|
|
|
|
|
- * @param array|bool $resource 资源
|
|
|
|
|
|
|
+ * @param string|array $name 方法名称
|
|
|
|
|
+ * @param array|bool $resource 资源
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function rest($name, $resource = [])
|
|
public static function rest($name, $resource = [])
|
|
@@ -672,9 +683,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册未匹配路由规则后的处理
|
|
* 注册未匹配路由规则后的处理
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param string $method 请求类型
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param string $method 请求类型
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function miss($route, $method = '*', $option = [])
|
|
public static function miss($route, $method = '*', $option = [])
|
|
@@ -685,7 +696,7 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 注册一个自动解析的URL路由
|
|
* 注册一个自动解析的URL路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function auto($route)
|
|
public static function auto($route)
|
|
@@ -715,9 +726,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测子域名部署
|
|
* 检测子域名部署
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param Request $request Request请求对象
|
|
|
|
|
- * @param array $currentRules 当前路由规则
|
|
|
|
|
- * @param string $method 请求类型
|
|
|
|
|
|
|
+ * @param Request $request Request请求对象
|
|
|
|
|
+ * @param array $currentRules 当前路由规则
|
|
|
|
|
+ * @param string $method 请求类型
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
public static function checkDomain($request, &$currentRules, $method = 'get')
|
|
public static function checkDomain($request, &$currentRules, $method = 'get')
|
|
@@ -726,7 +737,7 @@ class Route
|
|
|
$rules = self::$rules['domain'];
|
|
$rules = self::$rules['domain'];
|
|
|
// 开启子域名部署 支持二级和三级域名
|
|
// 开启子域名部署 支持二级和三级域名
|
|
|
if (!empty($rules)) {
|
|
if (!empty($rules)) {
|
|
|
- $host = $request->host();
|
|
|
|
|
|
|
+ $host = $request->host(true);
|
|
|
if (isset($rules[$host])) {
|
|
if (isset($rules[$host])) {
|
|
|
// 完整域名或者IP配置
|
|
// 完整域名或者IP配置
|
|
|
$item = $rules[$host];
|
|
$item = $rules[$host];
|
|
@@ -816,18 +827,27 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测URL路由
|
|
* 检测URL路由
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param Request $request Request请求对象
|
|
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
- * @param bool $checkDomain 是否检测域名规则
|
|
|
|
|
|
|
+ * @param Request $request Request请求对象
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
|
|
+ * @param bool $checkDomain 是否检测域名规则
|
|
|
* @return false|array
|
|
* @return false|array
|
|
|
*/
|
|
*/
|
|
|
public static function check($request, $url, $depr = '/', $checkDomain = false)
|
|
public static function check($request, $url, $depr = '/', $checkDomain = false)
|
|
|
{
|
|
{
|
|
|
|
|
+ //检查解析缓存
|
|
|
|
|
+ if (!App::$debug && Config::get('route_check_cache')) {
|
|
|
|
|
+ $key = self::getCheckCacheKey($request);
|
|
|
|
|
+ if (Cache::has($key)) {
|
|
|
|
|
+ list($rule, $route, $pathinfo, $option, $matches) = Cache::get($key);
|
|
|
|
|
+ return self::parseRule($rule, $route, $pathinfo, $option, $matches, true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 分隔符替换 确保路由定义使用统一的分隔符
|
|
// 分隔符替换 确保路由定义使用统一的分隔符
|
|
|
$url = str_replace($depr, '|', $url);
|
|
$url = str_replace($depr, '|', $url);
|
|
|
|
|
|
|
|
- if (strpos($url, '|') && isset(self::$rules['alias'][strstr($url, '|', true)])) {
|
|
|
|
|
|
|
+ if (isset(self::$rules['alias'][$url]) || isset(self::$rules['alias'][strstr($url, '|', true)])) {
|
|
|
// 检测路由别名
|
|
// 检测路由别名
|
|
|
$result = self::checkRouteAlias($request, $url, $depr);
|
|
$result = self::checkRouteAlias($request, $url, $depr);
|
|
|
if (false !== $result) {
|
|
if (false !== $result) {
|
|
@@ -836,7 +856,7 @@ class Route
|
|
|
}
|
|
}
|
|
|
$method = strtolower($request->method());
|
|
$method = strtolower($request->method());
|
|
|
// 获取当前请求类型的路由规则
|
|
// 获取当前请求类型的路由规则
|
|
|
- $rules = self::$rules[$method];
|
|
|
|
|
|
|
+ $rules = isset(self::$rules[$method]) ? self::$rules[$method] : [];
|
|
|
// 检测域名部署
|
|
// 检测域名部署
|
|
|
if ($checkDomain) {
|
|
if ($checkDomain) {
|
|
|
self::checkDomain($request, $rules, $method);
|
|
self::checkDomain($request, $rules, $method);
|
|
@@ -877,12 +897,12 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测路由规则
|
|
* 检测路由规则
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param Request $request
|
|
|
|
|
- * @param array $rules 路由规则
|
|
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $depr URL分割符
|
|
|
|
|
- * @param string $group 路由分组名
|
|
|
|
|
- * @param array $options 路由参数(分组)
|
|
|
|
|
|
|
+ * @param Request $request
|
|
|
|
|
+ * @param array $rules 路由规则
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $depr URL分割符
|
|
|
|
|
+ * @param string $group 路由分组名
|
|
|
|
|
+ * @param array $options 路由参数(分组)
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
private static function checkRoute($request, $rules, $url, $depr = '/', $group = '', $options = [])
|
|
private static function checkRoute($request, $rules, $url, $depr = '/', $group = '', $options = [])
|
|
@@ -918,7 +938,7 @@ class Route
|
|
|
} else {
|
|
} else {
|
|
|
$str = $key;
|
|
$str = $key;
|
|
|
}
|
|
}
|
|
|
- if (is_string($str) && $str && 0 !== strpos(str_replace('|', '/', $url), $str)) {
|
|
|
|
|
|
|
+ if (is_string($str) && $str && 0 !== stripos(str_replace('|', '/', $url), $str)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
self::setOption($option);
|
|
self::setOption($option);
|
|
@@ -960,9 +980,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测路由别名
|
|
* 检测路由别名
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param Request $request
|
|
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param Request $request
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
private static function checkRouteAlias($request, $url, $depr)
|
|
private static function checkRouteAlias($request, $url, $depr)
|
|
@@ -1007,9 +1027,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测URL绑定
|
|
* 检测URL绑定
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param array $rules 路由规则
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param array $rules 路由规则
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return mixed
|
|
* @return mixed
|
|
|
*/
|
|
*/
|
|
|
private static function checkUrlBind(&$url, &$rules, $depr = '/')
|
|
private static function checkUrlBind(&$url, &$rules, $depr = '/')
|
|
@@ -1038,9 +1058,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 绑定到类
|
|
* 绑定到类
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $class 类名(带命名空间)
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $class 类名(带命名空间)
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function bindToClass($url, $class, $depr = '/')
|
|
public static function bindToClass($url, $class, $depr = '/')
|
|
@@ -1051,15 +1071,15 @@ class Route
|
|
|
if (!empty($array[1])) {
|
|
if (!empty($array[1])) {
|
|
|
self::parseUrlParams($array[1]);
|
|
self::parseUrlParams($array[1]);
|
|
|
}
|
|
}
|
|
|
- return ['type' => 'method', 'method' => [$class, $action]];
|
|
|
|
|
|
|
+ return ['type' => 'method', 'method' => [$class, $action], 'var' => []];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 绑定到命名空间
|
|
* 绑定到命名空间
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $namespace 命名空间
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $namespace 命名空间
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function bindToNamespace($url, $namespace, $depr = '/')
|
|
public static function bindToNamespace($url, $namespace, $depr = '/')
|
|
@@ -1071,15 +1091,15 @@ class Route
|
|
|
if (!empty($array[2])) {
|
|
if (!empty($array[2])) {
|
|
|
self::parseUrlParams($array[2]);
|
|
self::parseUrlParams($array[2]);
|
|
|
}
|
|
}
|
|
|
- return ['type' => 'method', 'method' => [$namespace . '\\' . Loader::parseName($class, 1), $method]];
|
|
|
|
|
|
|
+ return ['type' => 'method', 'method' => [$namespace . '\\' . Loader::parseName($class, 1), $method], 'var' => []];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 绑定到控制器类
|
|
* 绑定到控制器类
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $controller 控制器名 (支持带模块名 index/user )
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $controller 控制器名 (支持带模块名 index/user )
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function bindToController($url, $controller, $depr = '/')
|
|
public static function bindToController($url, $controller, $depr = '/')
|
|
@@ -1090,15 +1110,15 @@ class Route
|
|
|
if (!empty($array[1])) {
|
|
if (!empty($array[1])) {
|
|
|
self::parseUrlParams($array[1]);
|
|
self::parseUrlParams($array[1]);
|
|
|
}
|
|
}
|
|
|
- return ['type' => 'controller', 'controller' => $controller . '/' . $action];
|
|
|
|
|
|
|
+ return ['type' => 'controller', 'controller' => $controller . '/' . $action, 'var' => []];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 绑定到模块/控制器
|
|
* 绑定到模块/控制器
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $controller 控制器类名(带命名空间)
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $controller 控制器类名(带命名空间)
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function bindToModule($url, $controller, $depr = '/')
|
|
public static function bindToModule($url, $controller, $depr = '/')
|
|
@@ -1115,8 +1135,8 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 路由参数有效性检查
|
|
* 路由参数有效性检查
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param Request $request Request对象
|
|
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param Request $request Request对象
|
|
|
* @return bool
|
|
* @return bool
|
|
|
*/
|
|
*/
|
|
|
private static function checkOption($option, $request)
|
|
private static function checkOption($option, $request)
|
|
@@ -1126,8 +1146,8 @@ class Route
|
|
|
|| (isset($option['ajax']) && !$option['ajax'] && $request->isAjax()) // 非Ajax检测
|
|
|| (isset($option['ajax']) && !$option['ajax'] && $request->isAjax()) // 非Ajax检测
|
|
|
|| (isset($option['pjax']) && $option['pjax'] && !$request->isPjax()) // Pjax检测
|
|
|| (isset($option['pjax']) && $option['pjax'] && !$request->isPjax()) // Pjax检测
|
|
|
|| (isset($option['pjax']) && !$option['pjax'] && $request->isPjax()) // 非Pjax检测
|
|
|| (isset($option['pjax']) && !$option['pjax'] && $request->isPjax()) // 非Pjax检测
|
|
|
- || (isset($option['ext']) && false === stripos('|' . $option['ext'] . '|', $request->ext() ? '|' . $request->ext() . '|' : '')) // 伪静态后缀检测
|
|
|
|
|
- || (isset($option['deny_ext']) && false !== stripos('|' . $option['deny_ext'] . '|', $request->ext() ? '|' . $request->ext() . '|' : ''))
|
|
|
|
|
|
|
+ || (isset($option['ext']) && false === stripos('|' . $option['ext'] . '|', '|' . $request->ext() . '|')) // 伪静态后缀检测
|
|
|
|
|
+ || (isset($option['deny_ext']) && false !== stripos('|' . $option['deny_ext'] . '|', '|' . $request->ext() . '|'))
|
|
|
|| (isset($option['domain']) && !in_array($option['domain'], [$_SERVER['HTTP_HOST'], self::$subDomain])) // 域名检测
|
|
|| (isset($option['domain']) && !in_array($option['domain'], [$_SERVER['HTTP_HOST'], self::$subDomain])) // 域名检测
|
|
|
|| (isset($option['https']) && $option['https'] && !$request->isSsl()) // https检测
|
|
|| (isset($option['https']) && $option['https'] && !$request->isSsl()) // https检测
|
|
|
|| (isset($option['https']) && !$option['https'] && $request->isSsl()) // https检测
|
|
|| (isset($option['https']) && !$option['https'] && $request->isSsl()) // https检测
|
|
@@ -1142,18 +1162,18 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测路由规则
|
|
* 检测路由规则
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param string $depr URL分隔符(全局)
|
|
|
|
|
|
|
+ * @param string $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param string $depr URL分隔符(全局)
|
|
|
* @return array|false
|
|
* @return array|false
|
|
|
*/
|
|
*/
|
|
|
private static function checkRule($rule, $route, $url, $pattern, $option, $depr)
|
|
private static function checkRule($rule, $route, $url, $pattern, $option, $depr)
|
|
|
{
|
|
{
|
|
|
// 检查完整规则定义
|
|
// 检查完整规则定义
|
|
|
- if (isset($pattern['__url__']) && !preg_match('/^' . $pattern['__url__'] . '/', str_replace('|', $depr, $url))) {
|
|
|
|
|
|
|
+ if (isset($pattern['__url__']) && !preg_match(0 === strpos($pattern['__url__'], '/') ? $pattern['__url__'] : '/^' . $pattern['__url__'] . '/', str_replace('|', $depr, $url))) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
// 检查路由的参数分隔符
|
|
// 检查路由的参数分隔符
|
|
@@ -1164,7 +1184,7 @@ class Route
|
|
|
$len1 = substr_count($url, '|');
|
|
$len1 = substr_count($url, '|');
|
|
|
$len2 = substr_count($rule, '/');
|
|
$len2 = substr_count($rule, '/');
|
|
|
// 多余参数是否合并
|
|
// 多余参数是否合并
|
|
|
- $merge = !empty($option['merge_extra_vars']) ? true : false;
|
|
|
|
|
|
|
+ $merge = !empty($option['merge_extra_vars']);
|
|
|
if ($merge && $len1 > $len2) {
|
|
if ($merge && $len1 > $len2) {
|
|
|
$url = str_replace('|', $depr, $url);
|
|
$url = str_replace('|', $depr, $url);
|
|
|
$url = implode('|', explode($depr, $url, $len2 + 1));
|
|
$url = implode('|', explode($depr, $url, $len2 + 1));
|
|
@@ -1178,9 +1198,9 @@ class Route
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
$pattern = array_merge(self::$rules['pattern'], $pattern);
|
|
$pattern = array_merge(self::$rules['pattern'], $pattern);
|
|
|
- if (false !== $match = self::match($url, $rule, $pattern, $merge)) {
|
|
|
|
|
|
|
+ if (false !== $match = self::match($url, $rule, $pattern)) {
|
|
|
// 匹配到路由规则
|
|
// 匹配到路由规则
|
|
|
- return self::parseRule($rule, $route, $url, $option, $match, $merge);
|
|
|
|
|
|
|
+ return self::parseRule($rule, $route, $url, $option, $match);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return false;
|
|
return false;
|
|
@@ -1189,9 +1209,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 解析模块的URL地址 [模块/控制器/操作?]参数1=值1&参数2=值2...
|
|
* 解析模块的URL地址 [模块/控制器/操作?]参数1=值1&参数2=值2...
|
|
|
* @access public
|
|
* @access public
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $depr URL分隔符
|
|
|
|
|
- * @param bool $autoSearch 是否自动深度搜索控制器
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $depr URL分隔符
|
|
|
|
|
+ * @param bool $autoSearch 是否自动深度搜索控制器
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
public static function parseUrl($url, $depr = '/', $autoSearch = false)
|
|
public static function parseUrl($url, $depr = '/', $autoSearch = false)
|
|
@@ -1258,7 +1278,7 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 解析URL的pathinfo参数和变量
|
|
* 解析URL的pathinfo参数和变量
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $url URL地址
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
private static function parseUrlPath($url)
|
|
private static function parseUrlPath($url)
|
|
@@ -1275,9 +1295,6 @@ class Route
|
|
|
} elseif (strpos($url, '/')) {
|
|
} elseif (strpos($url, '/')) {
|
|
|
// [模块/控制器/操作]
|
|
// [模块/控制器/操作]
|
|
|
$path = explode('/', $url);
|
|
$path = explode('/', $url);
|
|
|
- } elseif (false !== strpos($url, '=')) {
|
|
|
|
|
- // 参数1=值1&参数2=值2...
|
|
|
|
|
- parse_str($url, $var);
|
|
|
|
|
} else {
|
|
} else {
|
|
|
$path = [$url];
|
|
$path = [$url];
|
|
|
}
|
|
}
|
|
@@ -1287,9 +1304,9 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 检测URL和规则路由是否匹配
|
|
* 检测URL和规则路由是否匹配
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $url URL地址
|
|
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param array $pattern 变量规则
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param string $rule 路由规则
|
|
|
|
|
+ * @param array $pattern 变量规则
|
|
|
* @return array|false
|
|
* @return array|false
|
|
|
*/
|
|
*/
|
|
|
private static function match($url, $rule, $pattern)
|
|
private static function match($url, $rule, $pattern)
|
|
@@ -1346,7 +1363,7 @@ class Route
|
|
|
if (false === $result) {
|
|
if (false === $result) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- } elseif (!preg_match('/^' . $pattern[$name] . '$/', $m1[$key])) {
|
|
|
|
|
|
|
+ } elseif (!preg_match(0 === strpos($pattern[$name], '/') ? $pattern[$name] : '/^' . $pattern[$name] . '$/', $m1[$key])) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1362,16 +1379,28 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 解析规则路由
|
|
* 解析规则路由
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param string $route 路由地址
|
|
|
|
|
- * @param string $pathinfo URL地址
|
|
|
|
|
- * @param array $option 路由参数
|
|
|
|
|
- * @param array $matches 匹配的变量
|
|
|
|
|
|
|
+ * @param string $rule 路由规则
|
|
|
|
|
+ * @param string $route 路由地址
|
|
|
|
|
+ * @param string $pathinfo URL地址
|
|
|
|
|
+ * @param array $option 路由参数
|
|
|
|
|
+ * @param array $matches 匹配的变量
|
|
|
|
|
+ * @param bool $fromCache 通过缓存解析
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
- private static function parseRule($rule, $route, $pathinfo, $option = [], $matches = [])
|
|
|
|
|
|
|
+ private static function parseRule($rule, $route, $pathinfo, $option = [], $matches = [], $fromCache = false)
|
|
|
{
|
|
{
|
|
|
$request = Request::instance();
|
|
$request = Request::instance();
|
|
|
|
|
+
|
|
|
|
|
+ //保存解析缓存
|
|
|
|
|
+ if (Config::get('route_check_cache') && !$fromCache) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ $key = self::getCheckCacheKey($request);
|
|
|
|
|
+ Cache::tag('route_check')->set($key, [$rule, $route, $pathinfo, $option, $matches]);
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 解析路由规则
|
|
// 解析路由规则
|
|
|
if ($rule) {
|
|
if ($rule) {
|
|
|
$rule = explode('/', $rule);
|
|
$rule = explode('/', $rule);
|
|
@@ -1446,6 +1475,10 @@ class Route
|
|
|
$request->bind($bind);
|
|
$request->bind($bind);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (!empty($option['response'])) {
|
|
|
|
|
+ Hook::add('response_send', $option['response']);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 解析额外参数
|
|
// 解析额外参数
|
|
|
self::parseUrlParams(empty($paths) ? '' : implode('|', $paths), $matches);
|
|
self::parseUrlParams(empty($paths) ? '' : implode('|', $paths), $matches);
|
|
|
// 记录匹配的路由信息
|
|
// 记录匹配的路由信息
|
|
@@ -1494,18 +1527,19 @@ class Route
|
|
|
App::$modulePath = APP_PATH . (Config::get('app_multi_module') ? $request->module() . DS : '');
|
|
App::$modulePath = APP_PATH . (Config::get('app_multi_module') ? $request->module() . DS : '');
|
|
|
} else {
|
|
} else {
|
|
|
// 路由到模块/控制器/操作
|
|
// 路由到模块/控制器/操作
|
|
|
- $result = self::parseModule($route);
|
|
|
|
|
|
|
+ $result = self::parseModule($route, isset($option['convert']) ? $option['convert'] : false);
|
|
|
}
|
|
}
|
|
|
// 开启请求缓存
|
|
// 开启请求缓存
|
|
|
if ($request->isGet() && isset($option['cache'])) {
|
|
if ($request->isGet() && isset($option['cache'])) {
|
|
|
$cache = $option['cache'];
|
|
$cache = $option['cache'];
|
|
|
if (is_array($cache)) {
|
|
if (is_array($cache)) {
|
|
|
- list($key, $expire) = $cache;
|
|
|
|
|
|
|
+ list($key, $expire, $tag) = array_pad($cache, 3, null);
|
|
|
} else {
|
|
} else {
|
|
|
$key = str_replace('|', '/', $pathinfo);
|
|
$key = str_replace('|', '/', $pathinfo);
|
|
|
$expire = $cache;
|
|
$expire = $cache;
|
|
|
|
|
+ $tag = null;
|
|
|
}
|
|
}
|
|
|
- $request->cache($key, $expire);
|
|
|
|
|
|
|
+ $request->cache($key, $expire, $tag);
|
|
|
}
|
|
}
|
|
|
return $result;
|
|
return $result;
|
|
|
}
|
|
}
|
|
@@ -1513,10 +1547,11 @@ class Route
|
|
|
/**
|
|
/**
|
|
|
* 解析URL地址为 模块/控制器/操作
|
|
* 解析URL地址为 模块/控制器/操作
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $url URL地址
|
|
|
|
|
|
|
+ * @param string $url URL地址
|
|
|
|
|
+ * @param bool $convert 是否自动转换URL地址
|
|
|
* @return array
|
|
* @return array
|
|
|
*/
|
|
*/
|
|
|
- private static function parseModule($url)
|
|
|
|
|
|
|
+ private static function parseModule($url, $convert = false)
|
|
|
{
|
|
{
|
|
|
list($path, $var) = self::parseUrlPath($url);
|
|
list($path, $var) = self::parseUrlPath($url);
|
|
|
$action = array_pop($path);
|
|
$action = array_pop($path);
|
|
@@ -1530,14 +1565,14 @@ class Route
|
|
|
// 设置当前请求的路由变量
|
|
// 设置当前请求的路由变量
|
|
|
Request::instance()->route($var);
|
|
Request::instance()->route($var);
|
|
|
// 路由到模块/控制器/操作
|
|
// 路由到模块/控制器/操作
|
|
|
- return ['type' => 'module', 'module' => [$module, $controller, $action], 'convert' => false];
|
|
|
|
|
|
|
+ return ['type' => 'module', 'module' => [$module, $controller, $action], 'convert' => $convert];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 解析URL地址中的参数Request对象
|
|
* 解析URL地址中的参数Request对象
|
|
|
* @access private
|
|
* @access private
|
|
|
- * @param string $rule 路由规则
|
|
|
|
|
- * @param array $var 变量
|
|
|
|
|
|
|
+ * @param string $url 路由规则
|
|
|
|
|
+ * @param array $var 变量
|
|
|
* @return void
|
|
* @return void
|
|
|
*/
|
|
*/
|
|
|
private static function parseUrlParams($url, &$var = [])
|
|
private static function parseUrlParams($url, &$var = [])
|
|
@@ -1587,4 +1622,24 @@ class Route
|
|
|
}
|
|
}
|
|
|
return $var;
|
|
return $var;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取路由解析缓存的key
|
|
|
|
|
+ * @param Request $request
|
|
|
|
|
+ * @return string
|
|
|
|
|
+ */
|
|
|
|
|
+ private static function getCheckCacheKey(Request $request)
|
|
|
|
|
+ {
|
|
|
|
|
+ static $key;
|
|
|
|
|
+
|
|
|
|
|
+ if (empty($key)) {
|
|
|
|
|
+ if ($callback = Config::get('route_check_cache_key')) {
|
|
|
|
|
+ $key = call_user_func($callback, $request);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $key = "{$request->host(true)}|{$request->method()}|{$request->path()}";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return $key;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|