HPlus 路由增强组件 - 提供强大的路由注解系统,支持自动路由注册和参数验证

v3.1.3 2024-07-28 06:29 UTC

This package is auto-updated.

Last update: 2025-06-22 16:52:18 UTC


README

PHP Version Hyperf Version License

一个为 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 文档。

📝 最佳实践

  1. 命名约定

    • 控制器:单数名词 + Controller(如 UserController
    • RESTful 方法:使用标准名称(index, show, create, update, delete)
    • 扩展方法:使用描述性名称(search, export, batch)
  2. 路径设计

    • 优先使用自动生成,保持一致性
    • 复杂场景才手动指定路径
    • 遵循 RESTful 设计原则
  3. 安全考虑

    • 默认所有方法都需要路由注解才能访问
    • 敏感操作添加 security: true
    • 合理使用中间件

🐛 问题排查

  1. 路由未生成

    • 检查是否添加了路由注解
    • 确认控制器有 @ApiController 注解
    • 验证注解是否正确导入
  2. 路径不符合预期

    • 查看路由统计了解生成规则
    • 使用 path 参数自定义路径
    • 检查方法名是否符合映射规则

📄 许可证

MIT License

🤝 贡献

欢迎提交 Issue 和 Pull Request!