vinogradova/sanitizer

该包的最新版本(v1.0.4)没有可用的许可信息。

Sanitizer - 用于验证[键 => 值]格式结构数据的验证器

v1.0.4 2023-06-11 03:15 UTC

This package is not auto-updated.

Last update: 2024-09-30 04:37:48 UTC


README

Maintainability Test Coverage

技术任务书

假设我们需要处理来自客户端的HTTP请求或包含JSON格式数据的第三方API响应。需要编写一个“sanitizer”库,该库负责根据提供的规范验证和规范化数据。

要求

  • 独立完成任务,不考虑现有解决方案
  • 使用PHP/Python/JavaScript/TypeScript语言,不得使用外部库(除了测试库)
  • 支持以下数据类型
    • 字符串
    • 整数
    • 浮点数
    • 俄罗斯联邦电话号码
    • 结构(已知键的关联数组)
    • 单类型元素数组
  • 应能够指定数组和结构的元素类型
  • 结构和数组中的元素值可以是任何支持类型(包括其他数组、结构、数组结构、结构数组等)
  • 生成所有错误值的列表。错误描述的格式应提供将每个错误与原始值关联的能力。例如,如果输入数据是基于包含(表格)字段的HTML表单生成的,则应能够将每个错误与特定的表单字段关联
  • 测试

示例

  1. 对于JSON '{"foo": "123", "bar": "asd", "baz": "8 (950) 288-56-23"}',在程序员指定的字段类型“整数”、“字符串”和“电话号码”的情况下,应该得到包含三个字段:整数值foo = 123、字符串值bar = "asd"和字符串值"baz" = "79502885623"的关联数组

  2. 如果将字符串"123абв"指定为“整数”类型,则应生成错误

  3. 如果将字符串"260557"指定为“电话号码”类型,则应生成错误

实现

$data     = ['a' => [9502900655, 89502900655, 79502900655, "+7(950)290-06-55"]];
$typeData = ['a' => ['phone']];

$sanitizerV1 = new Sanitizer($data, $typeData);
$sanitizerV1->sanitize();
   
// Результат
// ['a' => ["79502900655", "79502900655", "79502900655", "79502900655"]]
$data = [
    'a' => [9502912600, 89502912600, 79502912600, "+7(950)291-26-00"],
	'b' => 234.5,
	'c' => [
		'aa' => "abc",
		"bb" => 234,
		"cc" => [1, 2, 3],
	],
	'd' => [123, 123, 234],
	'e' => [
		'array' => [123, 123, 123],
	]
];
$typeData = [
	'a' => ['phone'],
	'b' => 'float',
	'c' => ['aa'    => 'float', 'bb'  => 'integer', 'cc'  => ['integer']],
	'd' => ['integer123'],
	'e' => ['array' => ['phone']],
];

$sanitizerV2 = new Sanitizer($data, $typeData);
$sanitizerV2->sanitize();
// Результат
// [
//      'a' => ['79502912600', '79502912600', '79502912600', '79502912600'],
//      'b' => 234.5,
//      'c' => [
//      	'aa' => '"abc" является типом string. Для него был указан тип: float.',
//      	"bb" => 234,
//      	"cc" => [1, 2, 3],
//      ],
//      'd' => [
//          'Неизвестный тип данных: integer123.',
//          'Неизвестный тип данных: integer123.',
//          'Неизвестный тип данных: integer123.',
//      ],
//      'e' => [
//      	'array' => [
//      	    'Значение не соответстует формату номера телефона.',
//      	    'Значение не соответстует формату номера телефона.',
//      	    'Значение не соответстует формату номера телефона.',
//      	]
//      ]
//	];

sanitizer接受格式为:['key' => value]的数据及其类型。sanitize方法返回验证结果。

支持的数据类型

  • string
  • integer
  • float
  • phone
  • array - 传递包含数据类型数组的类型。例如,['string']
  • object - 传递与数据键匹配的关联数组,其中值是数据类型。例如,['a' => 'string']

数组和对象可以嵌套其他数组和对象。

运行测试

$ make test