diff --git a/framework/library/Router.php b/framework/library/Router.php index 008dbcd..0fe172f 100644 --- a/framework/library/Router.php +++ b/framework/library/Router.php @@ -141,33 +141,13 @@ class Router */ private function findRule($rules, $uri) { - $result = []; - if ($uri == '/' && isset($rules['/'])) { - $result[] = '/'; - } else { - // 如果不是首页则unset掉首页的规则,避免参与计算导致出错 - unset($rules['/']); - $keys = array_keys($rules); - foreach ($keys as $key) { - $pos = strpos($uri, $key); - if ($pos !== false) { - $endPos = $pos + strlen($key); - $result[$endPos] = $key; - } - } - } - if (!empty($result)) { - $max = max(array_keys($result)); - $rest = str_replace($result[$max], '', $uri); - if (($result[$max] == '/' && $uri != '/') || ($rest != '' && substr($rest, 0, 1) != '/')) { - return false; - } else { - $this->loadRuleParameters = $rules[$result[$max]]; - return [ - 'rule' => $result[$max], - 'parameters' => $this->loadRuleParameters, - ]; - } + $matchUri = ($uri == '/') ? '/' : '/' . trim($uri, '/'); + if (isset($rules[$matchUri])) { + $this->loadRuleParameters = $rules[$matchUri]; + return [ + 'rule' => $matchUri, + 'parameters' => $this->loadRuleParameters, + ]; } return false; } @@ -311,14 +291,16 @@ class Router // 配置中不执行的中间件 $exceptMiddlewareArray = []; - if (isset($this->loadRuleParameters['except_middleware']) + if ( + isset($this->loadRuleParameters['except_middleware']) && $this->loadRuleParameters['except_middleware'] != '' ) { $exceptMiddlewareArray = $this->loadRuleParameters['except_middleware']; } // 配置中新增的中间件 - if (isset($this->loadRuleParameters['accept_middleware']) + if ( + isset($this->loadRuleParameters['accept_middleware']) && $this->loadRuleParameters['accept_middleware'] != '' ) { $acceptMiddlewareArray = $this->loadRuleParameters['accept_middleware']; @@ -328,7 +310,7 @@ class Router } else continue; } } - + // 应用打包在在洋葱圈最里层 $next = $application; foreach ($middleware as $value) { @@ -361,7 +343,8 @@ class Router $defaultMethod = config('default_method'); $requestMethod = strtolower($this->request->requestMethod()); // 第一次用原始uri去做匹配,第二次带上默认方法去做匹配 - if (false === ($rule = $this->parseRouteRule($requestMethod, $uri)) + if ( + false === ($rule = $this->parseRouteRule($requestMethod, $uri)) && false === ($rule = $this->parseRouteRule($requestMethod, $uri . '/' . $defaultMethod)) ) { // 如果开启强制路由,则抛异常 @@ -404,16 +387,22 @@ class Router $files = scandir($controllerPath); for ($i = 2; $i < count($files); $i++) { $className = $namespace . '\\' . pathinfo($files[$i])['filename']; + // 获取组名 + $groupName = ''; + $clsasAnnotation = Annotation::getClassAnnotation($className); + if (isset($clsasAnnotation['group']) && ($group = trim($clsasAnnotation['group'])) != '') { + $groupName = '/' . trim($group, '/'); + } $reflectionClass = Application::getReflectionClass($className); foreach ($reflectionClass->getMethods() as $method) { if ($method->class == $className && substr($method->name, 0, 1) != '_') { $annotation = Annotation::getMethodAnnotation($className, $method->name); $requestMethod = (isset($annotation['requestMethod'])) ? $annotation['requestMethod'] : 'any'; - if (isset($annotation['route'])) { - $requestUri = $annotation['route']; + if (isset($annotation['route']) && ($uri = trim($annotation['route'])) != '') { + $requestUri = '/' . trim($uri, '/'); } else continue; $requestMethod = strtolower($requestMethod); - $rule = ($requestUri == '/') ? $requestUri : trim($requestUri, '/'); + $rule = $groupName . (($groupName != '' && $requestUri == '/') ? '' : $requestUri); $result[$requestMethod][$rule] = [ 'class' => $className, 'method' => $method->name, @@ -463,5 +452,4 @@ class Router return $result; } } - }