getAttributes()); if($classAttr->isEmpty()) return; $classAttrName = $classAttr->map->getName(); if(! $classAttrName->contains(RequestAttribute::class)) { return; } $requestMapping = $classAttr->first(fn ($item) => $item->getName() == RequestAttribute::class); $routeInstance = $requestMapping->newInstance(); // 默认参数 $routePrefix = $routeInstance->routePrefix ?? ''; $authGuard = $routeInstance->authGuard ?? null; $abilitiesPrefix = $routeInstance->abilitiesPrefix ?? ''; $middleware = self::registerMiddleware($routeInstance->middleware); $methods = $classRef->getMethods(); foreach ($methods as $method) { // 方法注解 $attributes = $method->getAttributes(); if(empty($attributes)) { continue; } $methodName = $method->getName(); foreach ($attributes as $attribute) { if (in_array($attribute->getName(), self::$mapping)) { $instance = $attribute->newInstance(); self::registerRoute( $instance, $methodName, $className, $authGuard, $middleware, $routePrefix, $abilitiesPrefix, ); } } } } catch (ReflectionException $e) { echo $e->getMessage(); } } /** * 注册路由 * @param BaseAttribute $instance * @param string $method * @param string $className * @param string|null $authGuard * @param array $middleware * @param string $routePrefix * @param string $abilitiesPrefix * @return void */ private static function registerRoute( BaseAttribute $instance, string $method, string $className, string $authGuard = null, array $middleware = [], string $routePrefix = '', string $abilitiesPrefix = '' ): void { $authorize = $instance->authorize; $authMiddleware = []; if (!empty($authorize)) { $authMiddleware[] = 'auth:sanctum'; if(! empty($authGuard) ) { $authMiddleware[] = 'authGuard:' . $authGuard; } else { $authMiddleware[] = 'authGuard'; } if (is_string($authorize) && !empty($abilitiesPrefix)) { $authMiddleware[] = 'abilities:' . $abilitiesPrefix . '.' . $authorize; } else if ($authorize !== true) { $authMiddleware[] = 'abilities:' . $authorize; } } $middleware = array_merge($authMiddleware, self::registerMiddleware($instance->middleware), $middleware); $route = Route::{Str::lower($instance->httpMethod)}( $routePrefix . $instance->route, [$className, $method] )->middleware(array_unique($middleware)); if (!empty($instance->where)) { $route->where($instance->where); } } /** * 获取中间件 * @param $middleware * @return string[] */ private static function registerMiddleware($middleware): array { if(empty($middleware)) { return []; } if(is_array($middleware)) { return $middleware; } if (is_string($middleware)) { return [$middleware]; } return []; } }