serkin/volan

PHP数组模式验证器

dev-master 2018-06-19 09:43 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:31:56 UTC


README

对于使用MongoDB或其他NoSQL解决方案并且关心客户端发送到数据库的数据的用户,以及寻找用PHP编写的验证库的用户。 Volan可以验证数组是否符合给定的模式,并提供有关无效节点的完整信息。它可以与日志记录一起使用,以便您可以查看整个验证过程。

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License SensioLabsInsight

安装

通过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