danack/params

此包已被废弃且不再维护。没有推荐替代包。

将用户输入转换为正确类型参数

0.8.0 2022-07-22 22:53 UTC

README

因此这里不会有任何活动。

Params

一个无框架验证输入参数的库。

Build Status

Actions Status

安装

composer require danack/params

TL:DR - 在应用程序中使用

此库允许你定义一组规则,这些规则定义了预期的输入参数,然后进行验证。

以下是一个用于检索文章列表的控制器中的代码示例

function getArticles(Request $request)
{
    $getArticlesParams = GetArticlesParams::createFromRequest($request);

    echo "After Id: " . $articleGetIndexParams->getAfterId() . PHP_EOL;
    echo "Limit:    " . $articleGetIndexParams->getLimit() . PHP_EOL;
}

上述示例如果存在任何验证问题,将抛出包含所有验证问题的 ValidationException

或者,你可以将参数和错误列表作为元组返回。

function getArticles(Request $request)
{
    [$getArticlesParams, $errors] = GetArticlesParams::createOrErrorFromVarMap($request);
    
    if ($errors !== null) {
        // do something about those errors.
    }

    echo "After Id: " . $articleGetIndexParams->getAfterId() . PHP_EOL;
    echo "Limit:    " . $articleGetIndexParams->getLimit() . PHP_EOL;
}

幕后基本用法

给定一组规则,库将从一个 '变量映射' 中提取适当的值,并验证这些值是否符合定义的规则。

$rules = [
  'limit' => [
    new CheckSetOrDefault(10, $variableMap),
    new IntegerInput(),
    new MinIntValue(0),
    new MaxIntValue(100),
  ],
  'offset' => [
    new CheckSetOrDefault(null, $variableMap),
    new SkipIfNull(),
    new MinIntValue(0),
    new MaxIntValue(1000000),
  ],
];

list($limit, $offset) = Params::validate($params);

该代码将从变量映射中提取 'limit' 和 'offset' 值,并检查 limit 是否是一个介于 0 和 100 之间的整数,offset 是否未设置,或必须是一个介于 0 和 1,000,000 之间的整数。

如果存在任何验证问题,将抛出 ValidationException。可以通过 ValidationException::getValidationProblems 获取验证问题。

幕后基本用法(无异常)

或者,你可以避免使用异常进行流程控制

$validator = new ParamsValidator();

$limit = $validator->validate('limit', [
    new CheckSetOrDefault(10, $variableMap),
    new IntegerInput(),
    new MinIntValue(0),
    new MaxIntValue(100),
]);

$offset = $validator->validate('offset', [
    new CheckSetOrDefault(null, $variableMap),
    new SkipIfNull(),
    new MinIntValue(0),
    new MaxIntValue(1000000),
]);

$errors = $validator->getValidationProblems();

if (count($errors) !== 0) {
    // return an error
    return [null, $errors];
}

// return an object with null 
return [new GetArticlesParams($order, $limit, $offset), null];

测试

我们运行了几个工具来提高代码质量。请运行 sh runTests.sh 来运行它们。

拉取请求应具有完整的单元测试覆盖率。最好是也通过 infection 实现完整的突变覆盖率。

相关信息

Json pointers - https://tools.ietf.org/html/rfc6901 JSON Patch - https://tools.ietf.org/html/rfc6902

未来工作

支持路径上的 Uri 片段编码

    #            // the whole document
    #/foo        ["bar", "baz"]
    #/foo/0      "bar"
    #/           0
    #/a~1b       1
    #/c%25d      2
    #/e%5Ef      3
    #/g%7Ch      4
    #/i%5Cj      5
    #/k%22l      6
    #/%20        7
    #/m~0n       8

参数位置

有些人关心参数是在查询字符串中还是体中。此库目前不支持区分它们。

待办事项

  • 颜色。

  • 未知/无效名称的错误。例如,当输入包含 'namme' 时,'name' 参数使用默认值,这听起来像是一个错误。

  • 更好地生成 OpenAPI 相关内容。