增加控制器路由分组@group注解

This commit is contained in:
TOP糯米 2024-07-22 16:51:28 +08:00
parent e505c13843
commit a53419328f
1 changed files with 23 additions and 35 deletions

View File

@ -141,34 +141,14 @@ class Router
*/ */
private function findRule($rules, $uri) private function findRule($rules, $uri)
{ {
$result = []; $matchUri = ($uri == '/') ? '/' : '/' . trim($uri, '/');
if ($uri == '/' && isset($rules['/'])) { if (isset($rules[$matchUri])) {
$result[] = '/'; $this->loadRuleParameters = $rules[$matchUri];
} 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 [ return [
'rule' => $result[$max], 'rule' => $matchUri,
'parameters' => $this->loadRuleParameters, 'parameters' => $this->loadRuleParameters,
]; ];
} }
}
return false; return false;
} }
@ -311,14 +291,16 @@ class Router
// 配置中不执行的中间件 // 配置中不执行的中间件
$exceptMiddlewareArray = []; $exceptMiddlewareArray = [];
if (isset($this->loadRuleParameters['except_middleware']) if (
isset($this->loadRuleParameters['except_middleware'])
&& $this->loadRuleParameters['except_middleware'] != '' && $this->loadRuleParameters['except_middleware'] != ''
) { ) {
$exceptMiddlewareArray = $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'] != '' && $this->loadRuleParameters['accept_middleware'] != ''
) { ) {
$acceptMiddlewareArray = $this->loadRuleParameters['accept_middleware']; $acceptMiddlewareArray = $this->loadRuleParameters['accept_middleware'];
@ -361,7 +343,8 @@ class Router
$defaultMethod = config('default_method'); $defaultMethod = config('default_method');
$requestMethod = strtolower($this->request->requestMethod()); $requestMethod = strtolower($this->request->requestMethod());
// 第一次用原始uri去做匹配第二次带上默认方法去做匹配 // 第一次用原始uri去做匹配第二次带上默认方法去做匹配
if (false === ($rule = $this->parseRouteRule($requestMethod, $uri)) if (
false === ($rule = $this->parseRouteRule($requestMethod, $uri))
&& false === ($rule = $this->parseRouteRule($requestMethod, $uri . '/' . $defaultMethod)) && false === ($rule = $this->parseRouteRule($requestMethod, $uri . '/' . $defaultMethod))
) { ) {
// 如果开启强制路由,则抛异常 // 如果开启强制路由,则抛异常
@ -404,16 +387,22 @@ class Router
$files = scandir($controllerPath); $files = scandir($controllerPath);
for ($i = 2; $i < count($files); $i++) { for ($i = 2; $i < count($files); $i++) {
$className = $namespace . '\\' . pathinfo($files[$i])['filename']; $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); $reflectionClass = Application::getReflectionClass($className);
foreach ($reflectionClass->getMethods() as $method) { foreach ($reflectionClass->getMethods() as $method) {
if ($method->class == $className && substr($method->name, 0, 1) != '_') { if ($method->class == $className && substr($method->name, 0, 1) != '_') {
$annotation = Annotation::getMethodAnnotation($className, $method->name); $annotation = Annotation::getMethodAnnotation($className, $method->name);
$requestMethod = (isset($annotation['requestMethod'])) ? $annotation['requestMethod'] : 'any'; $requestMethod = (isset($annotation['requestMethod'])) ? $annotation['requestMethod'] : 'any';
if (isset($annotation['route'])) { if (isset($annotation['route']) && ($uri = trim($annotation['route'])) != '') {
$requestUri = $annotation['route']; $requestUri = '/' . trim($uri, '/');
} else continue; } else continue;
$requestMethod = strtolower($requestMethod); $requestMethod = strtolower($requestMethod);
$rule = ($requestUri == '/') ? $requestUri : trim($requestUri, '/'); $rule = $groupName . (($groupName != '' && $requestUri == '/') ? '' : $requestUri);
$result[$requestMethod][$rule] = [ $result[$requestMethod][$rule] = [
'class' => $className, 'class' => $className,
'method' => $method->name, 'method' => $method->name,
@ -463,5 +452,4 @@ class Router
return $result; return $result;
} }
} }
} }