codexsoft/transmission-schema

Schema配置、验证和规范化部分,是CodexSoft Transmission PHP库的一部分,用于构建HTTP JSON API

v2.0.3 2022-03-19 23:38 UTC

README

紧凑的可扩展库,用于基于JSON构建HTTP API。

提供基于symfony/validator组件的规范化验证功能。

安装

composer require codexsoft/transmission

原因

假设我们在控制器中有如下入站数据

$input = [
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'pets' => [
        [
            'kind' => 42,
            'name' => 'Rex',
        ],
        [
            'kind' => 34,
            'name' => 'Sunny',
        ]
    ],
];
  • 我们将如何检查输入中的pets是否存在?
  • 我们将如何检查name是否为空或至少包含3个符号?
  • 我们将如何检查email是否格式正确?
  • 我们将如何检查pets至少有一个宠物?
  • 我们将如何检查pets[n].kind是否包含允许的值之一(15、34、42)?
  • 我们将如何处理这些违规行为并生成错误响应?

这个库允许你这样做

use CodexSoft\Transmission\Schema\Accept;

$schema = Accept::json([
    'name' => Accept::string()->minLength(3),
    'email' => Accept::email(),
    'pets' => Accept::collection(
        Accept::json([
            'kind' => Accept::integer()->choices([15, 34, 42]),
            'name' => Accept::string(),
        ])
    ),
]);

$result = $schema->validateNormalizedData($userInput);
if ($result->getViolations()->count()) {
    return new JsonResponse($result->getViolations());
}

$data = $result->getData();

这就对了!我们现在已经规范化了数据,可以进一步处理。

简介

此库支持许多标量数据类型定义和两种复杂类型定义:数组("集合")和哈希("json"),开箱即用。此库中数据类型定义称为Element。你可以通过扩展AbstractElement类来添加自己的数据类型。

要使用特定的元素,首先通过调用以下方式来实例化它

use CodexSoft\Transmission\Schema\Elements\BoolElement;

$element = new BoolElement();

或者使用Accept门面

use CodexSoft\Transmission\Schema\Accept;

$boolean = Accept::bool();

每个元素都有一些基本属性

  • 是否可以为空
  • 是否为必填项
  • 可选元素的默认值是什么
  • 值类型是否必须严格匹配元素数据类型或可以自动转换
  • 是否已弃用
  • 标签(或,注释)

更具体的元素具有更具体的属性。例如:字符串的最小长度、整数的最大值、可以是空字符串等。

当整数开启严格类型检查时,'42'将生成对此元素的违规。

所有内置元素的列表

用法

布尔数据的基本规范化。

use CodexSoft\Transmission\Schema\Accept;

$userInput = 'test';

$boolean = Accept::bool();
$result = $boolean->validateNormalizedData($userInput);
$result->getViolations()->count(); // 0
$result->getData(); // true

$strictBoolean = Accept::bool()->strict();
$result = $boolean->validateNormalizedData($userInput);
$result->getViolations()->count(); // 1
$result->getData(); // 'test'
  • labeldeprecated属性存在是出于历史原因,因为这个库最初是作为生成OpenApi schema的统一schema描述(检查codexsoft/transmission-openapi3)。

在使用规范化数据之前,请始终检查违规数量,因为在这种情况下,原始输入数据将存储在result.data中。

不会自动抛出异常,但你可以编写一个包装器来强制在检测到违规时抛出异常,或者以其他方式处理这种情况。

测试

php ./vendor/bin/phpunit