diff --git a/library/think/Route.php b/library/think/Route.php index 8bffdcd8..09673401 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -61,6 +61,8 @@ class Route private static $bind = []; // 当前分组信息 private static $group = []; + // 路由命名标识(用于快速URL生成) + private static $name = []; /** * 注册变量规则 @@ -106,6 +108,21 @@ class Route self::$bind = ['type' => $type, $type => $bind]; } + /** + * 设置路由绑定 + * @access public + * @param string $name 路由命名标识 + * @return string|array + */ + public static function name($name = '') + { + if ('' === $name) { + return self::$name; + } else { + return isset(self::$name[$name]) ? self::$name[$name] : null; + } + } + /** * 读取路由绑定 * @access public @@ -195,7 +212,7 @@ class Route $option['method'] = $type; $type = '*'; } - if (is_array($rule)) { + if (is_array($rule) && empty($route)) { foreach ($rule as $key => $val) { if (is_numeric($key)) { $key = array_shift($val); @@ -228,6 +245,9 @@ class Route */ protected static function setRule($rule, $route, $type = '*', $option = [], $pattern = [], $group = '') { + if (is_array($rule)) { + list($name, $rule) = $rule; + } if ('$' == substr($rule, -1, 1)) { // 是否完整匹配 $option['complete_match'] = true; @@ -237,6 +257,9 @@ class Route $rule = trim($rule, '/'); } $vars = self::parseVar($rule); + if (isset($name)) { + self::$name[$name] = [$rule, $vars]; + } if ($group) { self::$rules[$type][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern]; } else { diff --git a/library/think/Url.php b/library/think/Url.php index cf570af0..9fe9d1fc 100644 --- a/library/think/Url.php +++ b/library/think/Url.php @@ -69,15 +69,21 @@ class Url $vars = array_merge($params, $vars); } - // 获取路由别名 - $alias = self::getRouteAlias(); - // 检测路由 - if (0 !== strpos($url, '/') && isset($alias[$url]) && $match = self::getRouteUrl($alias[$url], $vars)) { - // 处理路由规则中的特殊字符 - $url = str_replace('[--think--]', '', $match); + $rule = Route::name($url); + if ($rule && $match = self::getRuleUrl($rule, $vars)) { + // 匹配路由命名标识 快速生成 + $url = $match; } else { - // 路由不存在 直接解析 - $url = self::parseUrl($url); + // 获取路由别名 + $alias = self::getRouteAlias(); + // 检测路由 + if (0 !== strpos($url, '/') && isset($alias[$url]) && $match = self::getRouteUrl($alias[$url], $vars)) { + // 处理路由规则中的特殊字符 + $url = $match; + } else { + // 路由不存在 直接解析 + $url = self::parseUrl($url); + } } // 检测URL绑定 @@ -225,10 +231,6 @@ class Url { foreach ($alias as $key => $val) { list($url, $pattern, $param) = $val; - // 解析安全替换 - if (strpos($url, '$')) { - $url = str_replace('$', '[--think--]', $url); - } // 检查变量匹配 $array = $vars; $match = false; @@ -257,6 +259,23 @@ class Url return false; } + // 匹配路由地址 + public static function getRuleUrl($rule, &$vars = []) + { + list($url, $pattern) = $rule; + foreach ($pattern as $key => $val) { + if (isset($vars[$key])) { + $url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key . '', '<' . $key . '>'], $vars[$key], $url); + unset($vars[$key]); + } elseif (2 == $val) { + $url = str_replace(['[:' . $key . ']', '<' . $key . '?>'], '', $url); + } else { + return false; + } + } + return $url; + } + // 生成路由映射并缓存 private static function getRouteAlias() {