增加路由解析缓存功能

This commit is contained in:
yunwuxin
2018-05-17 18:07:56 +08:00
parent de81a830d0
commit b229e2de33
2 changed files with 206 additions and 155 deletions

View File

@@ -68,8 +68,8 @@ class Route
/** /**
* 注册变量规则 * 注册变量规则
* @access public * @access public
* @param string|array $name 变量名 * @param string|array $name 变量名
* @param string $rule 变量规则 * @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 string|array $domain 子域名
* @param mixed $rule 路由规则 * @param mixed $rule 路由规则
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @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 mixed $bind 绑定信息
* @param string $type 绑定类型 默认为module 支持 namespace class controller * @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 string|array $name 路由命名标识 数组表示批量设置
* @param array $value 路由地址及变量信息 * @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 array $rule 路由规则
* @param string $type 请求类型 * @param string $type 请求类型
* @return void * @return void
*/ */
public static function import(array $rule, $type = '*') public static function import(array $rule, $type = '*')
@@ -222,11 +222,11 @@ class Route
/** /**
* 注册路由规则 * 注册路由规则
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $type 请求类型 * @param string $type 请求类型
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @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 = [])
@@ -270,12 +270,12 @@ class Route
/** /**
* 设置路由规则 * 设置路由规则
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $type 请求类型 * @param string $type 请求类型
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @param string $group 所属分组 * @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 = '')
@@ -348,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 = [])
@@ -369,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)
@@ -384,9 +384,9 @@ class Route
/** /**
* 设置当前的路由分组 * 设置当前的路由分组
* @access public * @access public
* @param string $name 分组名称 * @param string $name 分组名称
* @param array $option 分组路由参数 * @param array $option 分组路由参数
* @param array $pattern 分组变量规则 * @param array $pattern 分组变量规则
* @return void * @return void
*/ */
public static function setGroup($name, $option = [], $pattern = []) public static function setGroup($name, $option = [], $pattern = [])
@@ -399,10 +399,10 @@ class Route
/** /**
* 注册路由分组 * 注册路由分组
* @access public * @access public
* @param string|array $name 分组名称或者参数 * @param string|array $name 分组名称或者参数
* @param array|\Closure $routes 路由地址 * @param array|\Closure $routes 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function group($name, $routes, $option = [], $pattern = []) public static function group($name, $routes, $option = [], $pattern = [])
@@ -487,10 +487,10 @@ class Route
/** /**
* 注册路由 * 注册路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function any($rule, $route = '', $option = [], $pattern = []) public static function any($rule, $route = '', $option = [], $pattern = [])
@@ -501,10 +501,10 @@ class Route
/** /**
* 注册GET路由 * 注册GET路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function get($rule, $route = '', $option = [], $pattern = []) public static function get($rule, $route = '', $option = [], $pattern = [])
@@ -515,10 +515,10 @@ class Route
/** /**
* 注册POST路由 * 注册POST路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function post($rule, $route = '', $option = [], $pattern = []) public static function post($rule, $route = '', $option = [], $pattern = [])
@@ -529,10 +529,10 @@ class Route
/** /**
* 注册PUT路由 * 注册PUT路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function put($rule, $route = '', $option = [], $pattern = []) public static function put($rule, $route = '', $option = [], $pattern = [])
@@ -543,10 +543,10 @@ class Route
/** /**
* 注册DELETE路由 * 注册DELETE路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function delete($rule, $route = '', $option = [], $pattern = []) public static function delete($rule, $route = '', $option = [], $pattern = [])
@@ -557,10 +557,10 @@ class Route
/** /**
* 注册PATCH路由 * 注册PATCH路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function patch($rule, $route = '', $option = [], $pattern = []) public static function patch($rule, $route = '', $option = [], $pattern = [])
@@ -571,10 +571,10 @@ class Route
/** /**
* 注册资源路由 * 注册资源路由
* @access public * @access public
* @param string|array $rule 路由规则 * @param string|array $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function resource($rule, $route = '', $option = [], $pattern = []) public static function resource($rule, $route = '', $option = [], $pattern = [])
@@ -618,10 +618,10 @@ class Route
/** /**
* 注册控制器路由 操作方法对应不同的请求后缀 * 注册控制器路由 操作方法对应不同的请求后缀
* @access public * @access public
* @param string $rule 路由规则 * @param string $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return void * @return void
*/ */
public static function controller($rule, $route = '', $option = [], $pattern = []) public static function controller($rule, $route = '', $option = [], $pattern = [])
@@ -634,9 +634,9 @@ class Route
/** /**
* 注册别名路由 * 注册别名路由
* @access public * @access public
* @param string|array $rule 路由别名 * @param string|array $rule 路由别名
* @param string $route 路由地址 * @param string $route 路由地址
* @param array $option 路由参数 * @param array $option 路由参数
* @return void * @return void
*/ */
public static function alias($rule = null, $route = '', $option = []) public static function alias($rule = null, $route = '', $option = [])
@@ -651,8 +651,8 @@ class Route
/** /**
* 设置不同请求类型下面的方法前缀 * 设置不同请求类型下面的方法前缀
* @access public * @access public
* @param string $method 请求类型 * @param string $method 请求类型
* @param string $prefix 类型前缀 * @param string $prefix 类型前缀
* @return void * @return void
*/ */
public static function setMethodPrefix($method, $prefix = '') public static function setMethodPrefix($method, $prefix = '')
@@ -667,8 +667,8 @@ class Route
/** /**
* rest方法定义和修改 * rest方法定义和修改
* @access public * @access public
* @param string|array $name 方法名称 * @param string|array $name 方法名称
* @param array|bool $resource 资源 * @param array|bool $resource 资源
* @return void * @return void
*/ */
public static function rest($name, $resource = []) public static function rest($name, $resource = [])
@@ -683,9 +683,9 @@ class Route
/** /**
* 注册未匹配路由规则后的处理 * 注册未匹配路由规则后的处理
* @access public * @access public
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $method 请求类型 * @param string $method 请求类型
* @param array $option 路由参数 * @param array $option 路由参数
* @return void * @return void
*/ */
public static function miss($route, $method = '*', $option = []) public static function miss($route, $method = '*', $option = [])
@@ -696,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)
@@ -726,9 +726,9 @@ class Route
/** /**
* 检测子域名部署 * 检测子域名部署
* @access public * @access public
* @param Request $request Request请求对象 * @param Request $request Request请求对象
* @param array $currentRules 当前路由规则 * @param array $currentRules 当前路由规则
* @param string $method 请求类型 * @param string $method 请求类型
* @return void * @return void
*/ */
public static function checkDomain($request, &$currentRules, $method = 'get') public static function checkDomain($request, &$currentRules, $method = 'get')
@@ -827,14 +827,23 @@ class Route
/** /**
* 检测URL路由 * 检测URL路由
* @access public * @access public
* @param Request $request Request请求对象 * @param Request $request Request请求对象
* @param string $url URL地址 * @param string $url URL地址
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @param bool $checkDomain 是否检测域名规则 * @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 (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);
@@ -888,12 +897,12 @@ class Route
/** /**
* 检测路由规则 * 检测路由规则
* @access private * @access private
* @param Request $request * @param Request $request
* @param array $rules 路由规则 * @param array $rules 路由规则
* @param string $url URL地址 * @param string $url URL地址
* @param string $depr URL分割符 * @param string $depr URL分割符
* @param string $group 路由分组名 * @param string $group 路由分组名
* @param array $options 路由参数(分组) * @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 = [])
@@ -971,9 +980,9 @@ class Route
/** /**
* 检测路由别名 * 检测路由别名
* @access private * @access private
* @param Request $request * @param Request $request
* @param string $url URL地址 * @param string $url URL地址
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return mixed * @return mixed
*/ */
private static function checkRouteAlias($request, $url, $depr) private static function checkRouteAlias($request, $url, $depr)
@@ -984,7 +993,7 @@ class Route
if (is_array($item)) { if (is_array($item)) {
list($rule, $option) = $item; list($rule, $option) = $item;
$action = $array[0]; $action = $array[0];
if (isset($option['allow']) && !in_array($action, explode(',', $option['allow']))) { if (isset($option['allow']) && !in_array($action, explode(',', $option['allow']))) {
// 允许操作 // 允许操作
return false; return false;
@@ -1018,9 +1027,9 @@ class Route
/** /**
* 检测URL绑定 * 检测URL绑定
* @access private * @access private
* @param string $url URL地址 * @param string $url URL地址
* @param array $rules 路由规则 * @param array $rules 路由规则
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return mixed * @return mixed
*/ */
private static function checkUrlBind(&$url, &$rules, $depr = '/') private static function checkUrlBind(&$url, &$rules, $depr = '/')
@@ -1049,9 +1058,9 @@ class Route
/** /**
* 绑定到类 * 绑定到类
* @access public * @access public
* @param string $url URL地址 * @param string $url URL地址
* @param string $class 类名(带命名空间) * @param string $class 类名(带命名空间)
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return array * @return array
*/ */
public static function bindToClass($url, $class, $depr = '/') public static function bindToClass($url, $class, $depr = '/')
@@ -1068,9 +1077,9 @@ class Route
/** /**
* 绑定到命名空间 * 绑定到命名空间
* @access public * @access public
* @param string $url URL地址 * @param string $url URL地址
* @param string $namespace 命名空间 * @param string $namespace 命名空间
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return array * @return array
*/ */
public static function bindToNamespace($url, $namespace, $depr = '/') public static function bindToNamespace($url, $namespace, $depr = '/')
@@ -1088,9 +1097,9 @@ class Route
/** /**
* 绑定到控制器类 * 绑定到控制器类
* @access public * @access public
* @param string $url URL地址 * @param string $url URL地址
* @param string $controller 控制器名 (支持带模块名 index/user * @param string $controller 控制器名 (支持带模块名 index/user
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return array * @return array
*/ */
public static function bindToController($url, $controller, $depr = '/') public static function bindToController($url, $controller, $depr = '/')
@@ -1107,9 +1116,9 @@ class Route
/** /**
* 绑定到模块/控制器 * 绑定到模块/控制器
* @access public * @access public
* @param string $url URL地址 * @param string $url URL地址
* @param string $controller 控制器类名(带命名空间) * @param string $controller 控制器类名(带命名空间)
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @return array * @return array
*/ */
public static function bindToModule($url, $controller, $depr = '/') public static function bindToModule($url, $controller, $depr = '/')
@@ -1126,24 +1135,24 @@ class Route
/** /**
* 路由参数有效性检查 * 路由参数有效性检查
* @access private * @access private
* @param array $option 路由参数 * @param array $option 路由参数
* @param Request $request Request对象 * @param Request $request Request对象
* @return bool * @return bool
*/ */
private static function checkOption($option, $request) private static function checkOption($option, $request)
{ {
if ((isset($option['method']) && is_string($option['method']) && false === stripos($option['method'], $request->method())) if ((isset($option['method']) && is_string($option['method']) && false === stripos($option['method'], $request->method()))
|| (isset($option['ajax']) && $option['ajax'] && !$request->isAjax()) // Ajax检测 || (isset($option['ajax']) && $option['ajax'] && !$request->isAjax()) // Ajax检测
|| (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() . '|')) // 伪静态后缀检测 || (isset($option['ext']) && false === stripos('|' . $option['ext'] . '|', '|' . $request->ext() . '|')) // 伪静态后缀检测
|| (isset($option['deny_ext']) && false !== stripos('|' . $option['deny_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检测
|| (!empty($option['before_behavior']) && false === Hook::exec($option['before_behavior'])) // 行为检测 || (!empty($option['before_behavior']) && false === Hook::exec($option['before_behavior'])) // 行为检测
|| (!empty($option['callback']) && is_callable($option['callback']) && false === call_user_func($option['callback'])) // 自定义检测 || (!empty($option['callback']) && is_callable($option['callback']) && false === call_user_func($option['callback'])) // 自定义检测
) { ) {
return false; return false;
} }
@@ -1153,12 +1162,12 @@ class Route
/** /**
* 检测路由规则 * 检测路由规则
* @access private * @access private
* @param string $rule 路由规则 * @param string $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $url URL地址 * @param string $url URL地址
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @param array $option 路由参数 * @param array $option 路由参数
* @param string $depr URL分隔符全局 * @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)
@@ -1200,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 $url URL地址
* @param string $depr URL分隔符 * @param string $depr URL分隔符
* @param bool $autoSearch 是否自动深度搜索控制器 * @param bool $autoSearch 是否自动深度搜索控制器
* @return array * @return array
*/ */
public static function parseUrl($url, $depr = '/', $autoSearch = false) public static function parseUrl($url, $depr = '/', $autoSearch = false)
@@ -1213,9 +1222,9 @@ class Route
// 如果有模块/控制器绑定 // 如果有模块/控制器绑定
$url = $bind . ('.' != substr($bind, -1) ? $depr : '') . ltrim($url, $depr); $url = $bind . ('.' != substr($bind, -1) ? $depr : '') . ltrim($url, $depr);
} }
$url = str_replace($depr, '|', $url); $url = str_replace($depr, '|', $url);
list($path, $var) = self::parseUrlPath($url); list($path, $var) = self::parseUrlPath($url);
$route = [null, null, null]; $route = [null, null, null];
if (isset($path)) { if (isset($path)) {
// 解析模块 // 解析模块
$module = Config::get('app_multi_module') ? array_shift($path) : null; $module = Config::get('app_multi_module') ? array_shift($path) : null;
@@ -1269,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)
@@ -1295,9 +1304,9 @@ class Route
/** /**
* 检测URL和规则路由是否匹配 * 检测URL和规则路由是否匹配
* @access private * @access private
* @param string $url URL地址 * @param string $url URL地址
* @param string $rule 路由规则 * @param string $rule 路由规则
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @return array|false * @return array|false
*/ */
private static function match($url, $rule, $pattern) private static function match($url, $rule, $pattern)
@@ -1370,16 +1379,28 @@ class Route
/** /**
* 解析规则路由 * 解析规则路由
* @access private * @access private
* @param string $rule 路由规则 * @param string $rule 路由规则
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $pathinfo URL地址 * @param string $pathinfo URL地址
* @param array $option 路由参数 * @param array $option 路由参数
* @param array $matches 匹配的变量 * @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);
@@ -1492,14 +1513,14 @@ class Route
} elseif (false !== strpos($route, '\\')) { } elseif (false !== strpos($route, '\\')) {
// 路由到方法 // 路由到方法
list($path, $var) = self::parseUrlPath($route); list($path, $var) = self::parseUrlPath($route);
$route = str_replace('/', '@', implode('/', $path)); $route = str_replace('/', '@', implode('/', $path));
$method = strpos($route, '@') ? explode('@', $route) : $route; $method = strpos($route, '@') ? explode('@', $route) : $route;
$result = ['type' => 'method', 'method' => $method, 'var' => $var]; $result = ['type' => 'method', 'method' => $method, 'var' => $var];
} elseif (0 === strpos($route, '@')) { } elseif (0 === strpos($route, '@')) {
// 路由到控制器 // 路由到控制器
$route = substr($route, 1); $route = substr($route, 1);
list($route, $var) = self::parseUrlPath($route); list($route, $var) = self::parseUrlPath($route);
$result = ['type' => 'controller', 'controller' => implode('/', $route), 'var' => $var]; $result = ['type' => 'controller', 'controller' => implode('/', $route), 'var' => $var];
$request->action(array_pop($route)); $request->action(array_pop($route));
$request->controller($route ? array_pop($route) : Config::get('default_controller')); $request->controller($route ? array_pop($route) : Config::get('default_controller'));
$request->module($route ? array_pop($route) : Config::get('default_module')); $request->module($route ? array_pop($route) : Config::get('default_module'));
@@ -1526,17 +1547,17 @@ class Route
/** /**
* 解析URL地址为 模块/控制器/操作 * 解析URL地址为 模块/控制器/操作
* @access private * @access private
* @param string $url URL地址 * @param string $url URL地址
* @param bool $convert 是否自动转换URL地址 * @param bool $convert 是否自动转换URL地址
* @return array * @return array
*/ */
private static function parseModule($url, $convert = false) 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);
$controller = !empty($path) ? array_pop($path) : null; $controller = !empty($path) ? array_pop($path) : null;
$module = Config::get('app_multi_module') && !empty($path) ? array_pop($path) : null; $module = Config::get('app_multi_module') && !empty($path) ? array_pop($path) : null;
$method = Request::instance()->method(); $method = Request::instance()->method();
if (Config::get('use_action_prefix') && !empty(self::$methodPrefix[$method])) { if (Config::get('use_action_prefix') && !empty(self::$methodPrefix[$method])) {
// 操作方法前缀支持 // 操作方法前缀支持
$action = 0 !== strpos($action, self::$methodPrefix[$method]) ? self::$methodPrefix[$method] . $action : $action; $action = 0 !== strpos($action, self::$methodPrefix[$method]) ? self::$methodPrefix[$method] . $action : $action;
@@ -1550,8 +1571,8 @@ class Route
/** /**
* 解析URL地址中的参数Request对象 * 解析URL地址中的参数Request对象
* @access private * @access private
* @param string $url 路由规则 * @param string $url 路由规则
* @param array $var 变量 * @param array $var 变量
* @return void * @return void
*/ */
private static function parseUrlParams($url, &$var = []) private static function parseUrlParams($url, &$var = [])
@@ -1601,4 +1622,25 @@ 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;
}
} }

View File

@@ -10,8 +10,10 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace think\console\command; namespace think\console\command;
use think\Cache;
use think\console\Command; use think\console\Command;
use think\console\Input; use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option; use think\console\input\Option;
use think\console\Output; use think\console\Output;
@@ -22,6 +24,7 @@ class Clear extends Command
// 指令配置 // 指令配置
$this $this
->setName('clear') ->setName('clear')
->addArgument('type', Argument::OPTIONAL, 'type to clear', null)
->addOption('path', 'd', Option::VALUE_OPTIONAL, 'path to clear', null) ->addOption('path', 'd', Option::VALUE_OPTIONAL, 'path to clear', null)
->setDescription('Clear runtime file'); ->setDescription('Clear runtime file');
} }
@@ -30,8 +33,14 @@ class Clear extends Command
{ {
$path = $input->getOption('path') ?: RUNTIME_PATH; $path = $input->getOption('path') ?: RUNTIME_PATH;
if (is_dir($path)) { $type = $input->getArgument('type');
$this->clearPath($path);
if ($type == 'route') {
Cache::clear('route_check');
} else {
if (is_dir($path)) {
$this->clearPath($path);
}
} }
$output->writeln("<info>Clear Successed</info>"); $output->writeln("<info>Clear Successed</info>");