hyperf控制器需继承abstractcontroller并置于app\controller命名空间,路由支持config/routes.php配置和@autocontroller/@controller注解两种方式,且二者不可混用;带参数路由必须加正则约束如{id:\d+},变量名须与方法参数名严格一致。

要让Hyperf项目具备清晰可维护的请求入口和业务分层能力,必须严格遵循路由与控制器的编写规范,避免将验证、数据处理、数据库操作等逻辑混入控制器中。
创建标准控制器类
在app/Controller目录下新建PHP文件,例如UserController.php,文件名必须以Controller结尾。
类必须继承AbstractController,且命名空间为App\Controller;不继承或命名空间错误会导致依赖注入失效。
所有处理方法必须声明为public,protected/private方法不会被路由识别,也不会被框架自动注入请求对象。
方法签名中可直接类型提示RequestInterface,框架会自动注入当前请求实例,无需手动获取。
配置路由的两种核心方式
Hyperf支持配置文件集中式和注解驱动式两种路由定义路径,二者不可混用在同一控制器上。
方法一:通过config/routes.php统一管理
打开config/routes.php,引入Router类:use Hyperf\HttpServer\Router\Router;
使用静态方法绑定URL与控制器动作,例如:Router::get('/users', 'App\Controller\UserController@index');
支持多方法共用一个动作:Router::addRoute(['GET', 'POST'], '/login', 'App\Controller\AuthController::handle');
带正则约束的动态参数必须显式写出,如/users/{id:\d+}——【不加\d+会导致非法字符串ID进入控制器,引发类型转换异常】;若仅写{id},框架将接受任意字符,失去前置校验能力。
路由分组可复用前缀与中间件:Router::group(['prefix' => '/api/v1', 'middleware' => [AuthMiddleware::class]], function () { ... });
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
方法二:使用#[AutoController]快速生成
在控制器类顶部添加#[AutoController]注解,无需修改routes.php。
框架自动将类名转为蛇形小写作为基础路径,如UserDetailController→/user_detail,每个public方法生成同名子路径。
可通过prefix参数强制覆盖默认路径:#[AutoController(prefix: '/v2/users')],此时index()对应/v2/users/index。
该模式默认允许GET和POST,若只希望开放GET,需在方法内用$this->request->getMethod() === 'GET'判断并提前返回。
精细控制路由行为:#[Controller] + #[*Mapping]
当需要为同一路径支持不同HTTP方法、或对参数做强约束时,必须使用此组合。
第一步:在类上声明#[Controller],类本身不产生任何路由。
第二步:为每个方法单独添加动词注解,如#[GetMapping(path: 'profile/{uid:\d+}')]。
第三步:路径中变量名必须与方法参数名一致,且类型声明需匹配,例如public function profile(int $uid)——【变量名$uid与{uid:\d+}不一致将导致参数绑定失败,$uid值为null】。
第四步:支持联合多个注解,如同时标注#[GetMapping]和#[Middleware(AuthMiddleware::class)],实现权限拦截。
第五步:可为整个控制器统一添加中间件,只需在#[Controller]中传入middleware选项,避免每个方法重复写。










