peak / array-validation
用于数组结构的验证工具
3.2.0
2020-04-02 16:35 UTC
Requires
- php: >=7.2
- ext-json: *
- symfony/polyfill-php73: ^1.14
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9.0
README
安装
composer require peak/array-validation
这是什么?
此组件通过以下方式帮助您验证数组结构:
- 验证任何键值的类型
- 确保具有预期键要求的某种数据结构
- 通过仅允许一组键来防止结构污染
这在处理JSON数据请求时特别有用,在使用数据之前,您必须验证其内容,这样您就可以在之后使用业务逻辑检查这些键的值,而不用担心键值的类型或存在。
如何使用
8种用法
1- 通用“点菜式”验证(无状态)
$validator = new Validator(); if ($validator->expectExactlyKeys($data, $keys) === true) { // ... }
2- 使用流畅接口进行验证(有状态)
$data = [ // data 'tags' => [], 'name' => 'foobar' ]; $validation = new Validation($data); $validation ->expectExactlyKeys(['tags', 'name']) ->expectKeyToBeArray('tags'); ->expectKeyToBeString('name'); if ($validation->hasErrors()) { // $lastError = $validation->getLastError(); // $errors = $validation->getErrors(); }
3- 使用流畅接口进行严格验证(有状态)
$validation = new StrictValidation($data); // will throw an exception if any of tests below fail $validation ->expectOnlyKeys(['id', 'title', 'description', 'isPrivate', 'tags']) ->expectAtLeastKeys(['id', 'title', 'description']) ->expectKeyToBeInteger('id') ->expectKeysToBeString(['title', 'description']) ->expectKeyToBeBoolean('isPrivate') ->expectKeyToBeArray('tags'); // if we reach this point, it means the array structure is // valid according to the validation rules above.
4- 创建用于以后使用的验证定义
$vDef = new ValidationDefinition(); $vDef ->expectOnlyKeys(['title', 'content', 'description']) ->expectAtLeastKeys(['title', 'content']) ->expectKeysToBeString(['title', 'content', 'description']); $validation = new ValidationFromDefinition($vDef, $data); if ($validation->hasErrors()) { // $validation->getErrors(); }
5- 创建用于以后使用的验证模式
模式是编写验证定义的另一种方式。此格式在您想要将模式存储在文件中(例如:json、php数组文件、yml等)时非常理想。
$mySchema = [ 'title' => [ 'type' => 'string', 'required' => true ], 'content' => [ 'type' => 'string', 'nullable' => true, ], ]; $schema = new Schema(new SchemaCompiler(), $mySchema, 'mySchemaName'); $validation = new ValidationFromSchema($schema, $data); if ($validation->hasErrors()) { // $validation->getErrors(); }
6- 使用验证定义进行严格验证
// all validation definitions are executed at object creation and an exception is thrown if any of tests failed new StrictValidationFromDefinition($validationDefinition, $arrayToValidate);
7- 使用模式进行严格验证
// all validation definitions are executed at object creation and an exception is thrown if any of tests failed new StrictValidationFromSchema($schema, $arrayToValidate);
8- 使用ValidationBuilder进行验证和严格验证
$validation = new ValidationBuilder(); $validation ->expectOnlyKeys(['title', 'content', 'description']) ->expectAtLeastKeys(['title', 'content']) ->expectKeysToBeString(['title', 'content', 'description']); if ($validation->validate($data) === false) { // $validation->getErrors(); // $validation->getLastError(); }
以及严格验证
// will throw an exception if any of tests fail $validation->strictValidate($data);
验证方法
interface ValidationInterface { public function expectExactlyKeys(array $keys); public function expectOnlyOneFromKeys( array $keys); public function expectAtLeastKeys(array $keys); public function expectOnlyKeys(array $keys); public function expectNKeys(int $n); public function expectKeyToBeArray(string $key, bool $acceptNull = false); public function expectKeysToBeArray(array $keys, bool $acceptNull = false); public function expectKeyToBeInteger(string $key, bool $acceptNull = false); public function expectKeysToBeInteger(array $keys, bool $acceptNull = false); public function expectKeyToBeFloat(string $key, bool $acceptNull = false); public function expectKeysToBeFloat(array $keys, bool $acceptNull = false); public function expectKeyToBeString(string $key, bool $acceptNull = false); public function expectKeysToBeString(array $keys, bool $acceptNull = false); public function expectKeyToBeBoolean(string $key, bool $acceptNull = false); public function expectKeysToBeBoolean(array $keys, bool $acceptNull = false); public function expectKeyToBeObject(string $key, bool $acceptNull = false); public function expectKeysToBeObject(array $keys, bool $acceptNull = false); }