EasySwoole

注解参数验证

参数的 validate 接受规则对象数组。组件先从声明来源取值、按 type 转换,再执行规则;验证失败时不会调用目标 Action。本章用一个完整控制器演示必填、最小值和邮箱格式。

定义接口和规则

在应用项目根目录新建 App/HttpController/Member.php:

<?php

namespace App\HttpController;

use EasySwoole\HttpAnnotation\AnnotationController;
use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\ApiGroup;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Enum\ContentType;
use EasySwoole\HttpAnnotation\Enum\HttpMethod;
use EasySwoole\HttpAnnotation\Enum\ParamFrom;
use EasySwoole\HttpAnnotation\Enum\ParamType;
use EasySwoole\HttpAnnotation\Exception\ParamValidateFail;
use EasySwoole\HttpAnnotation\Validator\IsEmail;
use EasySwoole\HttpAnnotation\Validator\Min;
use EasySwoole\HttpAnnotation\Validator\Required;

#[ApiGroup(groupName: 'Member', description: '会员接口')]
class Member extends AnnotationController
{
    #[Api(
        allowMethod: HttpMethod::POST,
        acceptContentType: ContentType::JSON,
        requestParam: [
            new Param(
                name: 'age',
                from: ParamFrom::JSON,
                type: ParamType::INT,
                validate: [new Required(), new Min(18)]
            ),
            new Param(
                name: 'email',
                from: ParamFrom::JSON,
                validate: [new Required(), new IsEmail()]
            ),
        ],
        description: '创建会员'
    )]
    public function create(int $age, string $email): void
    {
        $this->writeJson(201, compact('age', 'email'));
    }

    protected function onException(\Throwable $error): void
    {
        if ($error instanceof ParamValidateFail) {
            $message = $error->getFailRule()->errorMsg($error->getParamName());
            $this->writeJson(422, null, $message);
            return;
        }

        parent::onException($error);
    }
}

请求体中 age 为数字字符串或数字时会转换为整数;create() 的形参名必须与 Param(name: ...) 对应。Required 检查缺失,Min(18) 检查最小值,IsEmail 检查邮箱格式。JSON 来源必须配合 ContentType::JSON,否则注解定义会在解析时抛错。

实际请求

启动或 reload 服务后运行:

curl -i -X POST http://127.0.0.1:9501/member/create \
  -H 'Content-Type: application/json' \
  -d '{"age":20,"email":"a@example.com"}'

curl -i -X POST http://127.0.0.1:9501/member/create \
  -H 'Content-Type: application/json' \
  -d '{"age":15,"email":"bad"}'

第一条请求进入 create() 并返回 201;第二条至少有一条规则不通过,进入 onException() 返回 422。示例只处理参数验证异常;真实项目还应按异常处理处理其他业务异常并记录服务端错误。

可选参数可以使用 Optional 与默认值,但不能把可选规则与 Required、NotEmpty 等必填规则混在同一个 Param 中。完整规则及用法见Attribute 验证规则;在 onRequest() 中声明公共参数的做法见onRequest 公共参数与继承。

下一章:生成接口文档。

源码依据