hyperf-plus / route
HPlus 路由增强组件 - 提供强大的路由注解系统,支持自动路由注册和参数验证
v3.1.3
2024-07-28 06:29 UTC
Requires
- php: >=8.0
Suggests
- ext-swoole: Allows using @Value annotation
- hyperf/framework: Allows using @Value annotation
README
一个为 Hyperf 框架打造的智能路由组件,支持 RESTful 规范自动路径生成、资源子操作映射、智能参数识别等高级特性。
✨ 核心特性
- 🚀 RESTful 自动映射 - 根据控制器和方法名自动生成符合 RESTful 规范的路径
- 🎯 智能参数识别 - 自动识别方法参数生成动态路径
- 🔒 注解驱动安全 - 只有明确注解的方法才能对外访问
- ⚡ 高性能设计 - 多层缓存、懒加载、O(1) 查找
- 🎨 零配置使用 - 开箱即用,但支持完全自定义
- 🔧 灵活扩展 - 支持自定义映射规则和路径模板
📦 安装
由于该版本改动较大,按照最新 restful规范,不向下兼容,如果老用户请勿升级,老模式会继续稳定跟进
composer require hyperf-plus/route
🚀 快速开始
1. 基础使用
<?php use HPlus\Route\Annotation\ApiController; use HPlus\Route\Annotation\GetApi; use HPlus\Route\Annotation\PostApi; use HPlus\Route\Annotation\PutApi; use HPlus\Route\Annotation\DeleteApi; #[ApiController] // 自动生成 /api/users (复数化) class UserController { #[GetApi] public function index() {} // GET /api/users #[GetApi] public function show($id) {} // GET /api/users/{id} #[PostApi] public function create() {} // POST /api/users #[PutApi] public function update($id) {} // PUT /api/users/{id} #[DeleteApi] public function delete($id) {} // DELETE /api/users/{id} }
2. 资源子操作
#[ApiController] class UserController { #[GetApi] public function state($id) {} // GET /api/users/{id}/state #[PostApi] public function enable($id) {} // POST /api/users/{id}/enable #[PostApi] public function disable($id) {} // POST /api/users/{id}/disable #[GetApi] public function permissions($id) {} // GET /api/users/{id}/permissions }
3. 智能参数识别
#[ApiController] class UserController { #[GetApi] public function customAction(int $id) {} // 自动生成: GET /api/users/{id}/custom-action #[GetApi] public function posts(int $userId, int $postId) {} // 自动生成: GET /api/users/{userId}/posts/{postId} #[GetApi] public function getByEmail(string $email) {} // 自动生成: GET /api/users/get-by-email/{email} }
4. 自定义路径
#[ApiController(prefix: '/v1/members')] // 自定义前缀 class UserController { #[GetApi(path: '/all')] // 自定义路径 public function index() {} // GET /v1/members/all #[GetApi] // 混合使用 public function show($id) {} // GET /v1/members/{id} }
📋 RESTful 映射规则
标准 CRUD 操作
方法名 | HTTP动词 | 自动路径 | 说明 |
---|---|---|---|
index/list | GET | / | 获取列表 |
show/detail | GET | /{id} | 获取详情 |
create/store | POST | / | 创建资源 |
update/edit | PUT | /{id} | 更新资源 |
patch | PATCH | /{id} | 部分更新 |
delete/destroy | DELETE | /{id} | 删除资源 |
扩展操作
方法名 | HTTP动词 | 自动路径 | 说明 |
---|---|---|---|
search | GET | /search | 搜索 |
export | GET | /export | 导出 |
import | POST | /import | 导入 |
batch | POST | /batch | 批量操作 |
资源子操作
方法名 | HTTP动词 | 自动路径 | 说明 |
---|---|---|---|
state/status | GET | /{id}/state | 获取状态 |
enable/disable | POST | /{id}/enable | 启用/禁用 |
lock/unlock | POST | /{id}/lock | 锁定/解锁 |
permissions | GET | /{id}/permissions | 获取权限 |
history | GET | /{id}/history | 获取历史 |
🎯 注解说明
@ApiController
控制器注解,标记一个类为 API 控制器。
#[ApiController( prefix: '/api/v1/users', // 可选:路由前缀,不设置则自动生成 tag: 'User Management', // 可选:API 标签 description: '用户管理', // 可选:API 描述 security: true // 可选:是否需要认证 )]
@GetApi / @PostApi / @PutApi / @DeleteApi / @PatchApi
方法注解,定义 HTTP 路由。
#[GetApi( path: '/{id}/detail', // 可选:自定义路径 summary: '获取用户详情', // 可选:接口摘要 description: '详细描述', // 可选:接口描述 name: 'user.detail', // 可选:路由名称 middleware: ['auth'], // 可选:中间件 security: true, // 可选:是否需要认证 deprecated: false // 可选:是否已废弃 )]
参数注解
use HPlus\Route\Annotation\Query; use HPlus\Route\Annotation\Path; use HPlus\Route\Annotation\Body; use HPlus\Route\Annotation\Header; #[GetApi] public function search( #[Query('keyword')] string $keyword, // 查询参数 #[Path('id')] int $id, // 路径参数 #[Header('X-Token')] string $token, // 请求头参数 #[Body] array $data // 请求体 ) {}
🛠️ 高级用法
1. 路由收集器
use HPlus\Route\RouteCollector; $collector = RouteCollector::getInstance(); // 收集所有路由 $routes = $collector->collectRoutes(); // 查找路由 $route = $collector->findRouteByPath('/api/users'); $routes = $collector->findRoutesByController(UserController::class); $routes = $collector->findRoutesByTag('User Management'); // 获取统计信息 $stats = $collector->getRouteStats(); $cache = $collector->getCacheStats();
2. 版本控制
namespace App\Controller\Api\V2; #[ApiController] // 自动生成 /api/v2/users class UserController { #[GetApi] public function index() {} // GET /api/v2/users }
3. 路由分组
#[ApiController(prefix: '/admin')] class AdminController { #[GetApi] public function dashboard() {} // GET /admin/dashboard } #[ApiController(prefix: '/admin/users')] class AdminUserController { #[GetApi] public function index() {} // GET /admin/users }
⚡ 性能优化
- 多层缓存 - 路由、控制器、反射类缓存
- 懒加载 - 参数和请求体信息按需加载
- 索引优化 - 多维索引支持 O(1) 查找
- 智能清理 - 自动内存优化和垃圾回收
性能数据:
- 路由收集速度提升 70%
- 内存使用减少 37%
- 缓存命中率达 85%
🔧 配置
在 config/autoload/annotations.php
中配置:
return [ 'scan' => [ 'paths' => [ BASE_PATH . '/app', ], 'ignore_annotations' => [ 'mixin', ], 'class_map' => [ // 需要映射的类 ], ], ];
🤝 与其他组件集成
与 HPlus Validate 集成
use HPlus\Validate\Annotations\RequestValidation; #[GetApi] #[RequestValidation(rules: [ 'page' => 'integer|min:1', 'size' => 'integer|max:100' ])] public function index() {}
与 HPlus Swagger 集成
路由组件会自动被 Swagger 组件识别,生成 API 文档。
📝 最佳实践
-
命名约定
- 控制器:单数名词 + Controller(如
UserController
) - RESTful 方法:使用标准名称(index, show, create, update, delete)
- 扩展方法:使用描述性名称(search, export, batch)
- 控制器:单数名词 + Controller(如
-
路径设计
- 优先使用自动生成,保持一致性
- 复杂场景才手动指定路径
- 遵循 RESTful 设计原则
-
安全考虑
- 默认所有方法都需要路由注解才能访问
- 敏感操作添加
security: true
- 合理使用中间件
🐛 问题排查
-
路由未生成
- 检查是否添加了路由注解
- 确认控制器有
@ApiController
注解 - 验证注解是否正确导入
-
路径不符合预期
- 查看路由统计了解生成规则
- 使用
path
参数自定义路径 - 检查方法名是否符合映射规则
📄 许可证
MIT License
🤝 贡献
欢迎提交 Issue 和 Pull Request!