fatbit/form-request-param 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

fatbit/form-request-param

Composer 安装命令:

composer require fatbit/form-request-param

包简介

this is hyperf form request param

README 文档

README

Github 地址 | Gitee 地址 (国内访问)

一个强大的 HTTP 请求参数验证器与 RequestParam 映射工具。旨在解决控制器层与逻辑层的数据参数转换与验证问题,让你的代码更优雅、更健壮!✨

✨ 主要特性

  • 🎯 自动验证:基于注解的声明式验证规则,由 Hyperf 自动触发。
  • 🔄 RequestParam 自动映射:请求参数自动转换为强类型的 PHP 对象,拒绝弱类型数组地狱。
  • 🧩 嵌套对象支持:支持无限层级的嵌套 RequestParam 验证与转换。
  • 📦 复杂类型兼容:完美支持 Union Types (如 RequestParam|array),智能判断并优先实例化对象。
  • ♻️ 复用性强:支持在控制器方法中自由组合多个 RequestParam,灵活应对不同业务场景。
  • 📋 数组处理:支持对象数组 (List<RequestParam>) 和关联数组 (Map<string, RequestParam>) 的自动转换。
  • 🛠 开箱即用:提供命令行工具快速生成 RequestParam 类。

📦 下载安装

composer require fatbit/form-request-param

🚀 快速上手

1. 创建 RequestParam 类

使用命令行工具快速生成:

php bin/hyperf gen:request-param User

执行后将在 App\RequestParams 目录下生成 UserRequestParam 类。

2. 定义验证规则与属性

使用 PHP 8.1+ 注解定义参数规则:

namespace App\RequestParams;

use Fatbit\FormRequestParam\Abstracts\AbstractFormRequestParam;
use Fatbit\FormRequestParam\Annotations\FormRequestRule;
use Fatbit\FormRequestParam\Annotations\FormRequestArrayRule;

class UserRequestParam extends AbstractFormRequestParam 
{
    #[FormRequestRule('required|string|max:255', '姓名')]
    public string $name;
    
    #[FormRequestRule('required|integer|in:1,2', '性别')]
    public int $sex;
    
    // 支持别名映射:前端传 'username' -> 映射到后端 $account
    #[FormRequestRule('required|string|max:255', '账号', 'username')]
    public string $account;
    
    // 简单数组验证
    #[FormRequestRule('required|array', '标签')]
    #[FormRequestArrayRule('*', 'required|int|gt:0', '标签Id')]
    public array $tags;
}

3. 在控制器中使用

在控制器方法中直接注入即可自动触发验证。支持组合复用多个 RequestParam,例如将通用的 ID 验证提取为 IdRequestParam

namespace App\Controller;

use App\RequestParams\UserRequestParam;
use App\RequestParams\IdRequestParam;

class UserController extends AbstractController
{
    /**
     * 创建用户
     * 自动验证 UserRequestParam
     */
    public function create(UserRequestParam $requestParam)
    {
        // 验证通过后,$requestParam 已经自动填充好数据
        // 直接传入 Service 层,业务逻辑无需再处理参数验证
        return $this->success($this->service->create($requestParam));
    }
    
    /**
     * 修改用户
     * ✨ 支持复用:同时注入多个 RequestParam
     * 自动验证所有注入的参数对象,任何一个验证失败都会终止请求
     */
    public function modify(IdRequestParam $idParam, UserRequestParam $userParam)
    {
        // $idParam 负责验证 ID 存在性与格式
        // $userParam 负责验证用户信息的合法性
        return $this->success($this->service->modify($idParam->id, $userParam));
    }
}

💡 高级用法

1. 嵌套对象 (Nested objects)

支持直接引用其他的 RequestParam 类作为属性,自动递归验证与实例化。

namespace App\RequestParams;

use Fatbit\FormRequestParam\Abstracts\AbstractFormRequestParam;
use Fatbit\FormRequestParam\Annotations\FormRequestRule;
use Fatbit\FormRequestParam\Annotations\FormRequestArrayRule;
class CreateOrderParam extends AbstractFormRequestParam 
{
    // 自动验证并实例化 UserInfoParam
    #[FormRequestRule('required', '用户信息')]
    public UserInfoParam $userInfo; 
    
    // 支持 Nullable
    #[FormRequestRule('nullable', '收货地址')]
    public ?AddressParam $address;
}

2. 联合类型与智能转换 (Union Types) ⚡️

完美支持 PHP 联合类型。当定义为 RequestParam|array 时,系统会优先尝试实例化对象,只有当实例化失败或数据不符合时才回退为数组。

namespace App\RequestParams;

use Fatbit\FormRequestParam\Abstracts\AbstractFormRequestParam;
use Fatbit\FormRequestParam\Annotations\FormRequestRule;
use Fatbit\FormRequestParam\Annotations\FormRequestArrayRule;
class ProductParam extends AbstractFormRequestParam 
{
    // 优先转换为 SkuParam 对象,如果失败则保留为数组
    #[FormRequestRule('required', 'SKU信息')]
    public SkuParam|array $skuInfo;
    
    // 明确指定属性为 array,但在注解中定义转换为 RequestParam
    // 此时 propertyType 为 array,但 toVal 指向 RequestParam,会调用 RequestParam->toArray()
    // 默认 arrayField 为 false (或者不传),表示直接转换当前字段
    #[FormRequestRule('required|array', '配置信息')]
    #[FormRequestArrayRule(ConfigParam::class)]
    public array $config;
    
    /**
     * @var AddressParam[]
     */
    // 2. 对象数组 (List Mode):验证并转换每个元素为 AddressParam
    // 使用 FormRequestArrayRule 并传入类名,arrayField 为 true 代表列表模式
    #[FormRequestRule('array', '其他地址列表')]
    #[FormRequestArrayRule(AddressParam::class, arrayField: true)]
    public array $otherAddresses;

    /**
     * @var array<string, AddressParam>
     */
    // 3. 关联数组对象 (Map Mode):针对特定 Key 转换
    // arrayField 为字符串键名 'company'
    #[FormRequestRule('array', '公司信息')]
    #[FormRequestArrayRule(AddressParam::class, arrayField: 'company')]
    public array $companyInfo; // $companyInfo['company'] 将被转换为 AddressParam 对象。
}

3. 数组对象列表 (List Mode) 📋

处理对象数组 [UserRequestParam, UserRequestParam]

提供了专用的 FormRequestListArrayRule 注解,语法更简洁。

namespace App\RequestParams;

use Fatbit\FormRequestParam\Abstracts\AbstractFormRequestParam;
use Fatbit\FormRequestParam\Annotations\FormRequestRule;
use Fatbit\FormRequestParam\Annotations\FormRequestListArrayRule;

class BatchCreateParam extends AbstractFormRequestParam 
{
    /**
     * @var UserRequestParam[]
     */
    #[FormRequestRule('required|array', '用户列表')]
    // 使用 FormRequestListArrayRule,默认数组索引模式
    // 等同于 #[FormRequestArrayRule(UserRequestParam::class, arrayField: true)]
    #[FormRequestListArrayRule(UserRequestParam::class)] 
    public array $userList;
}

4. 关联数组对象 (Map Mode) 🗺

处理特定 Key 的对象转换,例如 {"old": UserRequestParam, "new": UserRequestParam}

提供了专用的 FormRequestMappingArrayRule 注解,明确指定映射键。

namespace App\RequestParams;

use Fatbit\FormRequestParam\Abstracts\AbstractFormRequestParam;
use Fatbit\FormRequestParam\Annotations\FormRequestRule;
use Fatbit\FormRequestParam\Annotations\FormRequestMappingArrayRule;

class CompareParam extends AbstractFormRequestParam 
{
    /**
     * @var array<string, UserRequestParam>
     */
    #[FormRequestRule('array', '对比数据')]
    // 映射 old 字段 -> UserRequestParam
    #[FormRequestMappingArrayRule(UserRequestParam::class, 'old')]
    // 映射 new 字段 -> UserRequestParam
    #[FormRequestMappingArrayRule(UserRequestParam::class, 'new')]
    // 等同于 #[FormRequestArrayRule(UserRequestParam::class, arrayField: 'new')]
    public array $compareData;
}

📝 命令行工具

命令 描述
gen:request-param {name} 快速生成 RequestParam 类文件

🤝 贡献

欢迎提交 Issue 或 Pull Request!

License: MIT

fatbit/form-request-param 适用场景与选型建议

fatbit/form-request-param 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 67 次下载、GitHub Stars 达 2, 最近一次更新时间为 2024 年 02 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「param」 「form-request」 「hyperf」 「php8.0」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 fatbit/form-request-param 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 fatbit/form-request-param 我们能提供哪些服务?
定制开发 / 二次开发

基于 fatbit/form-request-param 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 67
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 6
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 2
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-02-23