From a53419328fb9c2cae2e2d13a40ac4f9419a234f3 Mon Sep 17 00:00:00 2001
From: topnuomi <1130395124@qq.com>
Date: Mon, 22 Jul 2024 16:51:28 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=A7=E5=88=B6=E5=99=A8?=
 =?UTF-8?q?=E8=B7=AF=E7=94=B1=E5=88=86=E7=BB=84@group=E6=B3=A8=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 framework/library/Router.php | 58 ++++++++++++++----------------------
 1 file changed, 23 insertions(+), 35 deletions(-)

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;
         }
     }
-
 }