From 66e50a4c333817f022540815dfd10e7431ca8ee9 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Mon, 11 Jan 2016 22:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BUrl=E7=94=9F=E6=88=90=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=85=E7=A9=BA=E5=88=AB=E5=90=8D=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=96=B9=E6=B3=95=20=E5=88=AB=E5=90=8D=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=86=85=E5=AE=B9=E5=8A=A0=E4=B8=8A=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Url.php | 77 ++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/library/think/Url.php b/library/think/Url.php index 3fc26ecc..4ff20c77 100644 --- a/library/think/Url.php +++ b/library/think/Url.php @@ -62,13 +62,13 @@ class Url // URL后缀 $suffix = self::parseSuffix($suffix); // 参数组装 - if (!empty($params)) { + if (!empty($vars)) { // 添加参数 if (Config::get('url_common_param')) { $vars = urldecode(http_build_query($vars)); $url .= $suffix . '?' . $vars; } else { - foreach ($params as $var => $val) { + foreach ($vars as $var => $val) { if ('' !== trim($val)) { $url .= $depr . $var . $depr . urlencode($val); } @@ -139,31 +139,13 @@ class Url return $domain; } - // 检测变量规则 - protected static function pattern($rule, $vars, $pattern) + // 检测路由规则中的变量是否有传入 + protected static function pattern($pattern, $vars) { - // 检测路由规则中的变量 - // 检测是否设置了参数分隔符 - if ($depr = Config::get('url_params_depr')) { - $rule = str_replace($depr, '/', $rule); - } - // 提取路由规则中的变量 - $var = []; - $array = explode('/', $rule); - foreach ($array as $val) { - $optional = false; - if (0 === strpos($val, '[:')) { - // 可选参数 - $val = substr($val, 1, -1); - $optional = true; - } - if (0 === strpos($val, ':')) { - // URL变量 - $name = substr($val, 1); - if (!$optional && !isset($vars[$name])) { - // 变量未设置 - return false; - } + foreach ($pattern as $key => $type) { + if (1 == $type && !isset($vars[$key])) { + // 变量未设置 + return false; } } return true; @@ -200,12 +182,13 @@ class Url { $alias = self::getRouteAlias(); if (!empty($alias[$name])) { - foreach ($alias[$name] as $key => $url) { + foreach ($alias[$name] as $key => $val) { + list($url, $pattern) = $val; // 检查变量匹配 if (strpos($url, '$')) { $url = str_replace('$', '[--think--]', $url); } - if (self::pattern($url, $vars, $check)) { + if (self::pattern($pattern, $vars)) { foreach ($vars as $key => $val) { if (false !== strpos($url, '[:' . $key . ']')) { $url = str_replace('[:' . $key . ']', $val, $url); @@ -241,14 +224,16 @@ class Url if (strpos($route, '?')) { $route = strstr($route, '?', true); } - $alias[$route][] = $rule . '/' . $key; + $var = self::parseVar($rule . '/' . $key); + $alias[$route][] = [$rule . '/' . $key, $var]; } } else { $route = $val['route']; if (strpos($route, '?')) { $route = strstr($route, '?', true); } - $alias[$route][] = $rule; + $var = self::parseVar($rule); + $alias[$route][] = [$rule, $var]; } } Cache::set('think_route_alias', $alias); @@ -256,4 +241,36 @@ class Url } return []; } + + // 分析路由规则中的变量 + private static function parseVar($rule) + { + // 检测是否设置了参数分隔符 + if ($depr = Config::get('url_params_depr')) { + $rule = str_replace($depr, '/', $rule); + } + // 提取路由规则中的变量 + $var = []; + foreach (explode('/', $rule) as $val) { + $optional = false; + if (0 === strpos($val, '[:')) { + // 可选参数 + $optional = true; + $val = substr($val, 1, -1); + } + if (0 === strpos($val, ':')) { + // URL变量 + $name = substr($val, 1); + $type = $optional ? 2 : 1; + $var[$name] = $type; + } + } + return $var; + } + + // 清空路由别名缓存 + public static function clearAliasCache() + { + Cache::rm('think_route_alias'); + } }