From d502c92c3238d6944e05b2f2ca00c8c5f0cba8b5 Mon Sep 17 00:00:00 2001 From: molong Date: Mon, 1 Aug 2016 17:42:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E6=A0=B8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/lang/zh-cn.php | 1 + core/library/think/Route.php | 15 +++++++++------ core/library/think/Url.php | 23 ++++++++++------------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/core/lang/zh-cn.php b/core/lang/zh-cn.php index 44731c34..98abf7a0 100644 --- a/core/lang/zh-cn.php +++ b/core/lang/zh-cn.php @@ -58,4 +58,5 @@ return [ 'tag error' => '模板标签错误', 'cache write error' => '缓存写入失败', 'sae mc write error' => 'SAE mc 写入错误', + 'route name not exists' => '路由命名标识不存在', ]; diff --git a/core/library/think/Route.php b/core/library/think/Route.php index f63e37e1..24f6fb08 100644 --- a/core/library/think/Route.php +++ b/core/library/think/Route.php @@ -257,7 +257,8 @@ class Route protected static function setRule($rule, $route, $type = '*', $option = [], $pattern = [], $group = '') { if (is_array($rule)) { - list($name, $rule) = $rule; + $name = $rule[0]; + $rule = $rule[1]; } if ('$' == substr($rule, -1, 1)) { // 是否完整匹配 @@ -334,11 +335,11 @@ class Route } if (!empty($name)) { // 分组 + $currentGroup = self::getGroup('name'); + if ($currentGroup) { + $name = $currentGroup . '/' . ltrim($name, '/'); + } if ($routes instanceof \Closure) { - $currentGroup = self::getGroup('name'); - if ($currentGroup) { - $name = $currentGroup . '/' . ltrim($name, '/'); - } $currentOption = self::getGroup('option'); $currentPattern = self::getGroup('pattern'); self::setGroup($name, $option, $pattern); @@ -348,7 +349,6 @@ class Route self::$rules['*'][$name]['var'] = self::parseVar($name); self::$rules['*'][$name]['option'] = $option; self::$rules['*'][$name]['pattern'] = $pattern; - } else { foreach ($routes as $key => $val) { if (is_numeric($key)) { @@ -381,6 +381,9 @@ class Route $currentGroup = self::getGroup('name'); $currentOption = self::getGroup('option'); $currentPattern = self::getGroup('pattern'); + if ($currentGroup) { + $name = $currentGroup . '/' . ltrim($name, '/'); + } self::setGroup($name, $option, $pattern); call_user_func_array($routes, []); self::setGroup($currentGroup, $currentOption, $currentPattern); diff --git a/core/library/think/Url.php b/core/library/think/Url.php index 9fe9d1fc..c2b6de21 100644 --- a/core/library/think/Url.php +++ b/core/library/think/Url.php @@ -19,9 +19,6 @@ use think\Route; class Url { - // 生成URL地址的root - protected static $root; - /** * URL生成 支持路由反射 * @param string $url URL表达式, @@ -39,6 +36,11 @@ class Url $domain = true; } // 解析URL + if (0 === strpos($url, '[') && $pos = strpos($url, ']')) { + // [name] 表示使用路由命名标识生成URL + $name = substr($url, 1, $pos - 1); + $url = 'name' . substr($url, $pos + 1); + } $info = parse_url($url); $url = !empty($info['path']) ? $info['path'] : ''; if (isset($info['fragment'])) { @@ -69,10 +71,12 @@ class Url $vars = array_merge($params, $vars); } - $rule = Route::name($url); + $rule = Route::name(isset($name) ? $name : $url); if ($rule && $match = self::getRuleUrl($rule, $vars)) { // 匹配路由命名标识 快速生成 $url = $match; + } elseif ($rule && isset($name)) { + throw new \InvalidArgumentException('route name not exists:' . $name); } else { // 获取路由别名 $alias = self::getRouteAlias(); @@ -122,7 +126,7 @@ class Url // 检测域名 $domain = self::parseDomain($url, $domain); // URL组装 - $url = $domain . (self::$root ?: Request::instance()->root()) . '/' . ltrim($url, '/'); + $url = $domain . Request::instance()->root() . '/' . ltrim($url, '/'); return $url; } @@ -338,11 +342,4 @@ class Url { Cache::rm('think_route_map'); } - - // 指定当前生成URL地址的root - public static function root($root) - { - self::$root = $root; - Request::instance()->root($root); - } -} +} \ No newline at end of file