From 07b52db1a2a483972ca679202767e430804dc1c2 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Thu, 31 Mar 2016 08:22:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BUrl=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=B1=BB=E5=AF=B9=E8=B7=AF=E7=94=B1=E6=98=A0=E5=B0=84=E5=92=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=8A=A8=E6=80=81=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Url.php | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/library/think/Url.php b/library/think/Url.php index 12fa847e..3339fa86 100644 --- a/library/think/Url.php +++ b/library/think/Url.php @@ -208,13 +208,13 @@ class Url public static function getRouteUrl($alias, &$vars = []) { foreach ($alias as $key => $val) { - list($url, $pattern) = $val; + list($url, $pattern, $param) = $val; // 解析安全替换 if (strpos($url, '$')) { $url = str_replace('$', '[--think--]', $url); } // 检查变量匹配 - if (self::pattern($pattern, $vars)) { + if ($pattern && self::pattern($pattern, $vars)) { foreach ($pattern as $key => $val) { if (isset($vars[$key])) { $url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key . '', '<' . $key . '>'], $vars[$key], $url); @@ -224,6 +224,9 @@ class Url } } return $url; + } elseif (!empty($param) && $param == $vars) { + $vars = []; + return $url; } } return false; @@ -237,9 +240,6 @@ class Url } // 获取路由定义 $rules = Route::getRules(); - if (empty($rules)) { - return []; - } foreach ($rules as $rule => $val) { if (!empty($val['routes'])) { foreach ($val['routes'] as $key => $route) { @@ -247,34 +247,43 @@ class Url $key = array_shift($route); } $route = $route[0]; + $param = []; if (is_array($route)) { $route = implode('\\', $route); } elseif ($route instanceof \Closure) { continue; } elseif (strpos($route, '?')) { - $route = strstr($route, '?', true); + list($route, $str) = explode('?', $route, 2); + parse_str($str, $param); } $var = self::parseVar($rule . '/' . $key); - $alias[$route][] = [$rule . '/' . $key, $var]; + $alias[$route][] = [$rule . '/' . $key, $var, $param]; } } else { $route = $val['route']; + $param = []; if (is_array($route)) { $route = implode('\\', $route); } elseif ($route instanceof \Closure) { continue; } elseif (strpos($route, '?')) { - $route = strstr($route, '?', true); + list($route, $str) = explode('?', $route, 2); + parse_str($str, $param); } $var = self::parseVar($rule); - $alias[$route][] = [$rule, $var]; + $alias[$route][] = [$rule, $var, $param]; } } // 检测路由映射 $maps = Route::map(); foreach ($maps as $rule => $route) { - $alias[$route][] = [$rule, []]; + $param = []; + if (strpos($route, '?')) { + list($route, $str) = explode('?', $route, 2); + parse_str($str, $param); + } + $alias[$route][] = [$rule, [], $param]; } !APP_DEBUG && Cache::set('think_route_alias', $alias); return $alias;