powar/json-validator

简单的PHP JSON验证器。非常快,配置简单。

1.0.0 2019-05-10 12:23 UTC

README

EasyJsonValidator - 简单的PHP JSON验证器。非常快,配置简单。此验证器无需JsonSchema(https://json-schema.fullstack.org.cn/)。

功能

  1. 简单类型检查,如字段 name - 字符串
  2. 范围检查,如字段 number - 从1到10,或字段 date -> 从2019-01-01到2019-02-01
  3. 必需检查,如字段 id 是必需的
  4. 嵌套对象检查,如多维数组,具有所有可用验证
  5. 任意日期格式的时间检查
  6. 通过正则表达式模式(preg_match)检查,如字段 email - /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i
  7. 通过回调函数检查,如字段 email - function($email) { return filter_var($email, FILTER_VALIDATE_EMAIL); }
  8. 为任何规则自定义错误消息

安装

composer require powar/json-validator

使用

获取任何JSON

$json = json_encode(['id' => 11, 'name' => 'JohnDoe', 'balance' => null, 'date' => date(DateTime::ISO8601)]);

创建规则

$rules = [
    'id' => [
        Validator::KEY_TYPE => Validator::TYPE_INTEGER,
        Validator::KEY_MAX_VAL => 10,
    ],
    'name' => Validator::TYPE_STRING,
    'balance' => Validator::TYPE_NULL,
    'date' => Validator::TYPE_DATETIME,
];

验证

$validator = new \Powar\JsonValidator\Validator();
$validator->validate($json, $rules);

检查是否存在错误

if ($validator->hasErrors()) {
    print_r($validator->getErrors());
}

array(1) {
   'id' =>
   string(20) "must be less than 10"
 }

文档

制作规则

validate方法接受一个数组作为第二个参数,用于验证规则

简单示例

$rules = ['id' => 'int']
$validator->validate($json, $rules);

此规则将仅检查传入的JSON是否与id:integer字段匹配。

注意,你可以明确写出'int'或另一种类型,但我推荐使用Validator::TYPE常量。*

使用常量的示例

$rules = ['id' => Validator::TYPE_INTEGER];

规则常量的列表

使用配置的示例

$rules = ['id' => [
            Validator::KEY_TYPE => Validator::TYPE_INTEGER,
            Validator::KEY_MAX_VAL => 10,
            ]
         ];

注意,现在id包含一个数组,其中必须包含Validator :: KEY_TYPE键,该键必须包含类型,正如简单情况一样

配置常量的列表

一些示例

如果你包含对象,你可以使用存在规则

$someRule = [
    'some_field' => [
        Validator::KEY_TYPE => Validator::TYPE_INTEGER,
        Validator::KEY_MAX_VAL => 10,
        Validator::KEY_MAX_STR => 2,
    ],
    'some_date' => [
        Validator::KEY_TYPE => Validator::TYPE_DATETIME,
        Validator::KEY_FORMAT => 'Y-m-d\TH:i:sP',
        Validator::KEY_REQUIRE => false,
    ]
];

$rules = [
    'some_id' => Validator::TYPE_INTEGER,
    'some_clildren_element' => [
        Validator::KEY_TYPE => Validator::TYPE_ARRAY,
        Validator::KEY_RULE => $someRule,
    ]
];

或者你可以创建一些小的规则,如下所示

$idRule = [
        Validator::KEY_TYPE => Validator::TYPE_INTEGER,
        Validator::KEY_MIN_STR => 1,
        Validator::KEY_MAX_STR => 11,
];

$dateRule = [
    Validator::KEY_TYPE => Validator::TYPE_DATETIME,
    Validator::KEY_FORMAT => DateTime::ISO8601,
    Validator::KEY_REQUIRE => false,
];

然后将其用于任何规则

$rules = [
    'some_id' => $idRule,
    'some_date' => $dateRule,
];

注意!当你为TYPE_DATETIME创建规则时,需要小心,因为KEY_MIN_VAL和KEY_MAX_VAL的工作方式可能不明显

例如,你需要为出生日期创建检查(你知道,超过18岁)

$minDate = new DateTime();
$minDate->modify('-18 year');
$format = 'Y-m-d';

$rule = [
    'day_of_birth' => [
        Validator::KEY_TYPE => Validator::TYPE_DATETIME,
        Validator::KEY_FORMAT => $format,
        Validator::KEY_MIN_VAL => $minDate->format($format), //<< WRONG
    ]
];

应该使用 Validator::KEY_MAX_VAL

$minDate = new DateTime();
$minDate->modify('-18 year');
$format = 'Y-m-d';

$rule = [
    'day_of_birth' => [
        Validator::KEY_TYPE => Validator::TYPE_DATETIME,
        Validator::KEY_FORMAT => $format,
        Validator::KEY_MAX_VAL => $minDate->format($format),
    ]
];

回调示例

 $rule = [
     'email' => [
         Validator::KEY_TYPE => Validator::TYPE_STRING,
         Validator::KEY_CALLBACK => function($email) {
            return filter_var($email, FILTER_VALIDATE_EMAIL);
         }
     ]
 ];

自定义错误消息

$someRule = [
    'some_field' => [
        Validator::KEY_TYPE => Validator::TYPE_INTEGER,
        Validator::KEY_MAX_VAL => 10,
        Validator::KEY_MAX_STR => 2,
        Validator::KEY_LABEL => 'validator.error.some_field',
    ],
];

getErrors() -> ['some_field' => 'validator.error.some_field']

更多示例请参阅单元测试