diff --git a/library/think/Route.php b/library/think/Route.php index 4d7ded34..c9e58cda 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -95,10 +95,10 @@ class Route { if (is_array($domain)) { foreach ($domain as $key => $item) { - self::$rules['domain'][$key][] = [$item, $option, $pattern]; + self::$rules['domain'][$key] = [$item, $option, $pattern]; } } else { - self::$rules['domain'][$domain][] = [$rule, $option, $pattern]; + self::$rules['domain'][$domain] = [$rule, $option, $pattern]; } } @@ -598,6 +598,17 @@ class Route self::rule('__miss__', $route, $method, $option, []); } + /** + * 注册一个自动解析的URL路由 + * @access public + * @param string $route 路由地址 + * @return void + */ + public static function auto($route) + { + self::rule('__auto__', $route, '*', [], []); + } + /** * 获取或者批量设置路由定义 * @access public @@ -669,53 +680,51 @@ class Route } } if (!empty($item)) { - self::$domain = true; - foreach ($item as $val) { - list($rule, $option, $pattern) = $val; - // 子域名部署规则 - if ($rule instanceof \Closure) { - // 执行闭包 - $reflect = new \ReflectionFunction($rule); - self::$bind = $reflect->invokeArgs([]); - return; - } elseif (is_array($rule)) { - // 清空当前路由规则 - self::$rules[$method] = []; - self::$rules['*'] = []; - self::group('', function () use ($rule) { - // 动态注册域名的路由规则 - self::registerRules($rule); - }, $option, $pattern); - return; - } + self::$domain = true; + list($rule, $option, $pattern) = $item; + // 子域名部署规则 + if ($rule instanceof \Closure) { + // 执行闭包 + $reflect = new \ReflectionFunction($rule); + self::$bind = $reflect->invokeArgs([]); + return; + } elseif (is_array($rule)) { + // 清空当前路由规则 + self::$rules[$method] = []; + self::$rules['*'] = []; + self::group('', function () use ($rule) { + // 动态注册域名的路由规则 + self::registerRules($rule); + }, $option, $pattern); + return; + } - if (strpos($rule, '?')) { - // 传入其它参数 - $array = parse_url($rule); - $result = $array['path']; - parse_str($array['query'], $params); - if (isset($panDomain)) { - $pos = array_search('*', $params); - if (false !== $pos) { - // 泛域名作为参数 - $params[$pos] = $panDomain; - } + if (strpos($rule, '?')) { + // 传入其它参数 + $array = parse_url($rule); + $result = $array['path']; + parse_str($array['query'], $params); + if (isset($panDomain)) { + $pos = array_search('*', $params); + if (false !== $pos) { + // 泛域名作为参数 + $params[$pos] = $panDomain; } - $_GET = array_merge($_GET, $params); - } else { - $result = $rule; } + $_GET = array_merge($_GET, $params); + } else { + $result = $rule; + } - if (0 === strpos($result, '\\')) { - // 绑定到命名空间 例如 \app\index\behavior - self::$bind = ['type' => 'namespace', 'namespace' => $result]; - } elseif (0 === strpos($result, '@')) { - // 绑定到类 例如 @app\index\controller\User - self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; - } else { - // 绑定到模块/控制器 例如 index/user - self::$bind = ['type' => 'module', 'module' => $result]; - } + if (0 === strpos($result, '\\')) { + // 绑定到命名空间 例如 \app\index\behavior + self::$bind = ['type' => 'namespace', 'namespace' => $result]; + } elseif (0 === strpos($result, '@')) { + // 绑定到类 例如 @app\index\controller\User + self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; + } else { + // 绑定到模块/控制器 例如 index/user + self::$bind = ['type' => 'module', 'module' => $result]; } } } @@ -773,7 +782,7 @@ class Route // 路由规则检测 if (!empty($rules)) { - return self::checkRoute($request, $rules, $url); + return self::checkRoute($request, $rules, $url, $depr); } return false; } @@ -784,10 +793,11 @@ class Route * @param Request $request * @param array $rules 路由规则 * @param string $url URL地址 + * @param string $depr URL分割符 * @param string $group 路由分组名 * @return mixed */ - private static function checkRoute($request, $rules, $url, $group = '') + private static function checkRoute($request, $rules, $url, $depr = '/', $group = '') { foreach ($rules as $key => $item) { if (true === $item) { @@ -818,14 +828,15 @@ class Route continue; } - $result = self::checkRoute($request, $rule, $url, $key); + $result = self::checkRoute($request, $rule, $url, $depr, $key); if (false !== $result) { return $result; } } elseif ($route) { - if ('__miss__' == $rule) { - // 指定MISS路由 - $miss = $item; + if ('__miss__' == $rule || '__auto__' == $rule) { + // 指定特殊路由 + $var = trim($rule, '__'); + ${$var} = $item; continue; } if ($group) { @@ -837,7 +848,10 @@ class Route } } } - if (isset($miss)) { + if (isset($auto)) { + // 自动解析URL地址 + return self::parseUrl($auto['route'] . '/' . $url, $depr); + } elseif (isset($miss)) { // 未匹配所有路由的路由规则处理 return self::parseRule('', $miss['route'], $url, $miss['option']); }