EasySwoole

接口参数与传参

接口自己的参数写在 Action 的 #[Api(requestParam: [...])] 中,每一项是一个 new Param(...)。组件按 from 读取请求、按 type 转换、执行 validate,最后按参数名传给 Action。先看 Attribute 清单与定义参数了解全部构造参数;本页专注实际调用。

一个可运行的例子

在应用项目根目录新建 App/HttpController/OrderParams.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\Validator\Min;
use EasySwoole\HttpAnnotation\Validator\Required;

#[ApiGroup(groupName: 'OrderParams', description: '订单参数示例')]
class OrderParams extends AnnotationController
{
    #[Api(
        allowMethod: HttpMethod::GET,
        description: '按 ID 查询订单',
        requestParam: [
            new Param(
                name: 'id',
                from: ParamFrom::GET,
                type: ParamType::INT,
                validate: [new Required(), new Min(1)],
                description: '订单 ID,必须大于 0'
            ),
        ]
    )]
    public function detail(int $id): void
    {
        $this->writeJson(200, ['id' => $id, 'name' => '示例订单']);
    }

    #[Api(
        allowMethod: HttpMethod::POST,
        acceptContentType: ContentType::JSON,
        description: '创建订单',
        requestParam: [
            new Param(name: 'name', from: ParamFrom::JSON, validate: [new Required()], description: '订单名称'),
            new Param(name: 'quantity', from: ParamFrom::JSON, type: ParamType::INT, value: 1, description: '数量,默认 1'),
        ]
    )]
    public function create(string $name, int $quantity): void
    {
        $this->writeJson(201, compact('name', 'quantity'));
    }
}

已启动服务时先运行 php easyswoole.php server reload,然后请求:

curl -i 'http://127.0.0.1:9501/orderParams/detail?id=12'
curl -i -X POST 'http://127.0.0.1:9501/orderParams/create' \
  -H 'Content-Type: application/json' \
  -d '{"name":"书籍","quantity":2}'

第一条将 id 以整数 12 传入 detail();第二条从 JSON 请求体提取 name、quantity。省略 quantity 时使用默认值 1。Param(name: ...) 与 Action 形参名必须一致;缺少必需形参对应的注解会产生参数错误。description 会进入接口文档,不影响请求值。

来源、请求体与方法的对应关系

from 在哪里传 相关声明
ParamFrom::GET URL 查询串 ?id=12 可用于 GET,也可用于其他方法
ParamFrom::POST 表单字段 POST 等方法配 ContentType::FORM_DATA 或 FORM_URLENCODED
ParamFrom::JSON JSON 请求体 配 acceptContentType: ContentType::JSON
ParamFrom::HEADER、COOKIE 请求头、Cookie 不属于请求体
ParamFrom::FILE 上传文件 配 ContentType::FORM_DATA 和 ParamType::FILE
ParamFrom::XML、RAW_POST XML、原始请求体 分别配 ContentType::XML、RAW

GET/HEAD 不能定义 acceptContentType。非 GET/HEAD 方法若省略该项,默认按 FORM_DATA 处理。from 也可传数组(如 [ParamFrom::HEADER, ParamFrom::COOKIE]),按顺序读取第一个命中的来源;FILE 只能单独使用。DI、CONTEXT 等来源及全部参数选项见Attribute 清单。

用一个数组形参接收

如果 Action 只有一个 array 形参,声明的接口参数会合并为该数组:

#[Api(requestParam: [
    new Param(name: 'page', from: ParamFrom::GET, type: ParamType::INT, value: 1, description: '页码'),
])]
public function index(array $data): void
{
    $this->writeJson(200, ['page' => $data['page']]);
}

若希望某个未传入的可选字段完全不进入 $data,可在该 Param 上设置 ignorePassArgWhenNotSet: true。普通形参模式则按名称注入;不能混用一个数组形参与其他形参。

控制器间共用的参数(例如 token)应写在 onRequest() 公共参数,不是复制到每个 Api::requestParam。校验规则和失败处理见参数验证。