serkin / volan
PHP数组模式验证器
Requires
- php: >=7.0|>=5.4
- monolog/monolog: *
Requires (Dev)
- friendsofphp/php-cs-fixer: *
- phpunit/phpunit: ~4.8|~5.7
This package is not auto-updated.
Last update: 2024-09-28 17:31:56 UTC
README
对于使用MongoDB或其他NoSQL解决方案并且关心客户端发送到数据库的数据的用户,以及寻找用PHP编写的验证库的用户。 Volan
可以验证数组是否符合给定的模式,并提供有关无效节点的完整信息。它可以与日志记录一起使用,以便您可以查看整个验证过程。
安装
通过Composer
composer require serkin/volan dev-master
使用方法
您只需为每个节点指定_type
字段即可。 _type
是对验证类的引用。
include 'vendor/autoload.php'; $schema = [ 'root' => [ // Schema must begins with 'root' 'title' => [ '_type' => 'required_string' ], 'price' => [ '_type' => 'number' ], 'author' => [ '_type' => 'string' ], 'instock' => [ '_type' => 'required_boolean' ], 'info' => [ '_type' => 'array', 'isbn' => [ '_type' => 'string' ], 'pages' => [ '_type' => 'number' ] ], 'comments' => [ '_type' => 'nested_array', 'user_id' => [ '_type' => 'required_number' ], 'comment' => [ '_type' => 'required_string' ] ] ] ]; $book = [ 'title' => 'The Idiot', // Cannot be omitted 'instock' => true, // Cannot be omitted and has to be bool type 'info' => ['isbn' => '978-0451531520'], // 'price' can be omitted but if present has to be numeric type 'comments' => [ // Nested array check nested elements [ 'user_id' => 1, 'comment' => 'Good book', // 'extra_field' => 'bad field' // By default if key not present in schema validation stops and returns false ], [ 'user_id' => 2, 'comment' => 'I like it' ] ] ]; $validator = new \Volan\Volan($schema); $result = $validator->validate($book); // if $result->isValid() === false you can get full information about invalid node var_dump($result->getErrorInfo());
预定义验证器
字符串
string
: 字符串required_string
: 必须存在的字符串
数组
array
: 数组required_array
: 必须存在的数组nested_array
: 包含嵌套数组的数组required_nested_array
: 必须存在的包含嵌套数组的数组
布尔值
boolean
: 布尔值required_boolean
: 必须存在的布尔值
数字
number
: 整数或浮点数required_number
: 必须存在的整数或浮点数
自定义验证器
如果您需要额外的验证器,您可以通过扩展\Volan\Validator\AbstractValidator
类来创建它们。
- 在您的库中创建
src/Volan/Validator
文件夹。 - 添加您的自定义验证器
src/Volan/Validator/mongoid_validator.php
。以mongoid
验证器为例。
namespace Volan\Validator; class MongoidValidator extends AbstractValidator { public function isValid($nodeData) { return ($nodeData instanceof \MongoId); } }
- 在composer.json中添加自动加载。
"autoload": { "psr-4": { "Volan\\Validator\\": "src/Volan/Validator/" } }
与其他库一起使用
如果您想与Volan
一起使用其他验证库,这很容易。让我们看看它是如何与Respect验证引擎一起工作的。
namespace Volan\Validator; use Respect\Validation\Validator as v; class IntBetween10And20Validator extends AbstractValidator { public function isValid($nodeData) { return v::int()->between(10, 20)->validate($nodeData); } }
技巧
允许数据中存在额外键
如果您想允许数组中存在额外键,您可以在构造函数中定义它。
$validator = new \Volan\Volan($schema, $strictMode = false);
允许省略required
字段
在MongoDB中,当您只更新集合中的几个字段时,无法通过验证,因为可能缺少必需字段。您可以让验证器考虑所有必需验证为可选。
$validator = new \Volan\Volan($schema); $validator->setRequiredMode(false); $result = $validator->validate($book);
日志记录
如果您想查看验证过程,请设置日志记录器。
$validator = new \Volan\Volan($schema); $result = $validator->validate($book); $result->getLog();
PSR兼容的类名
您可以使用PSR兼容的名称为验证类。上一个使用mongoid
验证类的例子可以重写为:
namespace Volan\Validator; class MongoidValidator extends AbstractValidator { public function isValid($nodeData) { return ($nodeData instanceof \MongoId); } }
这里我们将mongoid_validator
改为MongoidValidator
。将int_between_10_and_20_validator
示例重写为IntBetween10And20Validator
。
关系结构
让我们假设我们在我们的书籍数据中有一个字段
... 'categories' => [new \MongoId('111111111111111111111111'),new \MongoId('111111111111111111111112')] ...
我们想确保所有元素不仅是MongoId
的实例,而且实际上存在于我们的数据库中。这很容易。我们的验证器将看起来像这样:namespace Volan\Validator;
class ArrayOfMongoids extends AbstractValidator { public function isValid($nodeData) { foreach($nodeData as $id) { if($id !instanceof \MongoId) || !$this->presentInCategoryCollection($id)) return false; } } return true; } public function presentInCategoryCollection($id) { // Getting connection and so on $collection = $db->selectCollection('categories'); return (bool)$collection->findOne(['_id' => $id]); } }
现在我们在模式中添加
... 'categories' => ['_type' => 'array_of_mongoids'] ...
依赖关系
- PHP: >= 5.4
贡献
有关详细信息,请参阅CONTRIBUTING。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。
测试
phpunit
或使用Docker
docker run --rm -v "$PWD":/var/src/ serkin/php7 vendor/bin/phpunit --debug
代码风格
docker run --rm -v "$PWD":/var/src/ serkin/php7 vendor/bin/php-cs-fixer fix src