From b46893eb6620f06211529c165c0b79ad98bda8d5 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Thu, 7 Jul 2016 15:56:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3Url=E7=B1=BB=E7=94=9F?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Route.php | 23 +++++++++++------------ library/think/Url.php | 28 +++++++++++----------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/library/think/Route.php b/library/think/Route.php index 74eb9ed2..02ce8871 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -275,7 +275,7 @@ class Route self::$rules[$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; if ('*' == $type) { // 注册路由快捷方式 - foreach (['GET', 'POST', 'PUT', 'DELETE'] as $method) { + foreach (['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'] as $method) { self::$rules[$method][$rule] = true; } } @@ -350,11 +350,11 @@ class Route self::$rules[$type][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern]; } if ('*' == $type) { - foreach (['GET', 'POST', 'PUT', 'DELETE'] as $method) { + foreach (['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'] as $method) { if (!isset(self::$rules[$method][$name])) { self::$rules[$method][$name] = true; } else { - self::$rules[$method][$name] = array_merge(self::$rules[$method][$name], self::$rules['*'][$name]); + self::$rules[$method][$name] = array_merge(self::$rules['*'][$name], self::$rules[$method][$name]); } } } @@ -730,11 +730,10 @@ class Route // 路由规则检测 if (!empty($rules)) { - foreach ($rules as $group => $val) { + foreach ($rules as $rule => $val) { if (true === $val) { - $val = self::$rules['*'][$group]; + $val = self::$rules['*'][$rule]; } - $rule = $val['rule']; $route = $val['route']; $vars = $val['var']; $option = $val['option']; @@ -749,19 +748,19 @@ class Route $miss = $route; continue; } - if (is_array($rule)) { + if (is_array($val['rule'])) { // 分组路由 - if (($pos = strpos($group, ':')) || ($pos = strpos($group, '<'))) { - $str = substr($group, 0, $pos); + if (($pos = strpos($rule, ':')) || ($pos = strpos($rule, '<'))) { + $str = substr($rule, 0, $pos); } else { - $str = $group; + $str = $rule; } if (0 !== strpos($url, $str)) { continue; } $missGroup = false; // 匹配到路由分组 - foreach ($rule as $key => $item) { + foreach ($val['rule'] as $item) { $key = $item['rule']; $route = $item['route']; $vars = $item['var']; @@ -778,7 +777,7 @@ class Route $missGroup = $item; continue; } - $key = $group . '/' . ltrim($key, '/'); + $key = $rule . '/' . ltrim($key, '/'); $result = self::checkRule($key, $route, $url, $pattern, $option); if (false !== $result) { $request->routeInfo(['rule' => $key, 'route' => $route, 'pattern' => $pattern, 'option' => $option]); diff --git a/library/think/Url.php b/library/think/Url.php index 532bab95..ad10eaf6 100644 --- a/library/think/Url.php +++ b/library/think/Url.php @@ -266,25 +266,19 @@ class Url } // 获取路由定义 $array = Route::getRules(); - unset($array['*']); foreach ($array as $type => $rules) { - foreach ($rules as $group => $val) { - if (true === $val) { + foreach ($rules as $rule => $val) { + if (true === $val || empty($val['rule'])) { continue; } - $rule = $val['rule']; - $route = $val['route']; - $vars = $val['var']; - $option = $val['option']; - $pattern = $val['pattern']; - if (is_array($rule)) { - foreach ($rule as $key => $val) { - $key = $val['rule']; - $route = $val['route']; - $var = $val['var']; - $option = $val['option']; - $pattern = $val['pattern']; - $param = []; + $route = $val['route']; + $vars = $val['var']; + if (is_array($val['rule'])) { + foreach ($val['rule'] as $val) { + $key = $val['rule']; + $route = $val['route']; + $var = $val['var']; + $param = []; if (is_array($route)) { $route = implode('\\', $route); } elseif ($route instanceof \Closure) { @@ -294,7 +288,7 @@ class Url parse_str($str, $param); } $var = array_merge($vars, $var); - $item[$route][] = [$group . '/' . $key, $var, $param]; + $item[$route][] = [$rule . '/' . $key, $var, $param]; } } else { $param = [];