cymapgt / validator
PHP Respect Validation Package 的包装器,用于在将数据存储在数据存储之前验证数据记录
Requires
- php: >=7.2.0
- respect/validation: ^1.0.0
Requires (Dev)
- phpunit/phpunit: 8.*
README
此包可以通过包装 Respect 包来验证数据类型。它可以对基于关系数据库中使用的数据类型命名的数据类型进行验证。因此,它可以验证字符串、varchar、整数、decimal、datetime、列表项或布尔值可以空或非空的值。验证函数可以接受数组作为参数来定义验证规则的选项。
验证规则定义在一个数组中,这样具有多个验证规则的数据(例如,整数、非空、无符号)可以通过一个函数调用进行验证。
描述
验证器包通过配置验证数组来允许我们利用 Respect 验证包。数组描述了在验证数据时要使用的规则,然后验证器服务生成方法链来验证输入数据。
安装
通过 Composer 安装应用程序
require "cymapgt/validator" : "^1.0.0"
用法
概述
验证器包有以下目标
-
为每个自然和派生数据类型创建自定义验证器类,例如字符串、整数
-
验证器将通过在运行时加载到类的数组中存储的配置数组进行参数化。它们还将有默认值。
-
对于每个派生数据类型,允许它从其父数据类型继承验证规则
-
使用断言强制抛出异常,以及将错误值返回到客户端或错误处理器
-
提供标志以使用自定义错误消息或提供的异常“树”结构
-
提供在执行验证时使用“检查”或“断言”的选项
使用验证器包
数据类型
该类支持的数据类型是从大多数 RDBMS 中使用的类型“借用”的。这里的想法是简化基本数据类型;并通过参数数组添加更多的验证规则。传递非法规则选项将导致 ValidatorException。
数据类型包括:
-strNull:字符串,非空
-strNotNull:字符串,可空
-varNull:VarChar,非空
-varNotNull:VarChar,可空
-intNull:整数,非空
-intNotNull:整数,可空
-decimalNotNull:浮点数,非空
-decimalNull:浮点数,可空
-datetimeNotNull:DateTime非空
-listItemNotNull:列表项非空(可以验证json对象以及PHP数组)
-bool:布尔数据类型(不可空)
异常处理
有三种验证模式,这将影响验证器在遇到无效数据类型时的响应
1.validate:验证器将返回 true 或 false,具体取决于数据是否有效
2.check:验证器将返回 true,或遇到的第一个异常
3.assert:验证器将返回 true,或将遇到的所有异常嵌套在数据类型中
默认情况下,包将模式设置为 assert。如果有异常,它将返回一个整洁的关联数组,其中包含遇到的问题的描述。
要更改模式,请使用 setMode() 方法
use cymapgt\core\utility\validator\TypeValidator;
$mode = 'validate';
TypeValidator::setMode($mode);
检索断言的示例
$jsonStringBroken = '
"id": 1,
"name": "Foo",
"price": 123,
"tags": [
"Bar",
"Eek"
],
"stock": {
"warehouse": 300,
"retail": 20
}
}';
$isValid = TypeValidator::listItemNotNull($jsonStringBroken));
if (is_array($isValid)) {
echo 'Errors found:' . PHP_EOL;
foreach ($isValid as $key => $value)) {
echo '-' . $key . ': ' . $value . PHP_EOL;
}
}
类型验证
//basic validation
use cymapgt\core\utility\validator\TypeValidator;
$testVal = '%rhossis83!';
$isValid = TypeValidator::varNull($testVal);
//validation with parameters
$paramOptions = array (
'alphaonly' => true,
'directory' => true,
'length' => array (
'min' => 0,
'max' => 20,
'inclusive' => true
);
$isValid = TypeValidator::varNotNull($testVal, $paramOptions);
//decimal validation
$testVal = 1000.0;
$isValid = TypeValidator::decimalNotNull($testVal);
//list item validation (can be array or json. Note there is also a json param for validating strings)
$jsonString = '{
"id": 1,
"name": "Foo",
"price": 123,
"tags": [
"Bar",
"Eek"
],
"stock": {
"warehouse": 300,
"retail": 20
}
}';
$isValid = TypeValidator::listItemNotNull($jsonString);
示例
此示例将展示如何定义一个用于存储小商店产品列表的 MySQL 表中数据进入的验证器。
SQL 表结构
CREATE TABLE `products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL,
`product_number` varchar(15) NOT NULL,
`in_stock` tinyint(1) unsigned NOT NULL,
`reorder_level` int(4) unsigned NOT NULL,
`safety_stock_level` int(4) unsigned NOT NULL,
`color` varchar(30) NOT NULL,
`size` varchar(5) NOT NULL,
`price` decimal(10,2) unsigned NOT NULL,
`listing_currency` varchar(3) NOT NULL,
`weight` decimal(10,2) unsigned NOT NULL,
`weight_uom` varchar(3) NOT NULL,
`product_line` varchar(15) NOT NULL,
`sell_start_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`sell_end_date` timestamp NOT NULL,
`special_notes` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
创建您的验证器参数
<?php
namespace Example\Product;
class ProductSettings
{
public static function validation() {
return array (
'name' => array (
'type' => 'varNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 60,
'inclusive' => true
)
),
'product_number' => array (
'type' => 'varNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 15,
'inclusive' => true
),
'in_stock' => array (
'type' => 'bool',
'params' => array()
),
'reorder_level' => array (
'type' => 'intNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 4,
'inclusive' => true
),
'safety_stock_level' => array (
'type' => 'intNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 4,
'inclusive' => true
),
'color' => array (
'type' => 'varNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 30,
'inclusive' => true
),
'size' => array (
'type' => 'varNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 5,
'inclusive' => true
),
'weight' => array (
'type' => 'decimalNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 11,
'inclusive' => true
),
'weight_uom' => array (
'type' => 'varcharNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 3,
'inclusive' => true
),
'product_line' => array (
'type' => 'varcharNotNull',
'params' => array (
'length' => array (
'min' => 1,
'max' => 15,
'inclusive' => true
),
'sell_start_date' => array (
'type' => 'datetimeNotNull',
'params' => array ()
),
'sell_end_date' => array (
'type' => 'datetimeNotNull',
'params' => array ()
),
'special_notes' => array (
'type' => 'varNull',
'params' => array ()
));
}
}
验证数据
假设数据已到达您的服务器,这是一个API端点,用于创建产品条目。我们使用默认的断言检查模式,该模式将所有异常存储在一个数组中,并在最后返回它们进行错误报告。如果验证成功,验证方法返回true。
use cymapgt\core\utility\validator\Validator;
use Example\Product;
//receive data from client
$productEntriesCollection = json_decode($productJsonString, true);
//validation func
$validateProduct = function($productEntry) {
//product settings config
$validationSettings = ProductSettings::validation();
foreach ($productEntry as $fieldName => $fieldValue) {
//get field validation settings
$fieldType = $validationSettings[$fieldName]['type'];
$fieldParams = $validationSettings[$fieldName]['params'];
//validate the field
$result = TypeValidator::$fieldType($fieldValue, $fieldParams);
//handle validation
if ($result === true) {
//send to queue for processing
} elseif (is_array($result)) {
//iterate result and store errors for reporting back
} else {
//return error
}
}
}
测试
该软件包提供PHPUnit测试
贡献
- 请通过邮箱 @rhossis 或通过Skype联系
- 您的贡献将使您成为作者
许可证
BSD-3条款