icanboogie / validate
根据一组规则验证数据
Requires
- php: >=5.5
Requires (Dev)
- icanboogie/errors: ^2.0
- psr/container: ^1.0
This package is auto-updated.
Last update: 2024-09-17 08:25:19 UTC
README
icanboogie/validate 包提供了一种简单的 API 用于数据验证。
以下是一些可用的验证器
-
标志
- Required,
required
: 表示值是必需的。应首先指定。
- Required,
-
通用
-
类型比较
-
引用比较
-
范围比较
- Between,
between
: 验证值是否在两个引用之间。 - NotBetween,
not-between
: 验证值是否不在两个引用之间。 - BetweenLength,
between-length
:验证字符串长度是否介于两个参考值之间。 - NotBetweenLength,
not-between-length
:验证字符串长度是否不介于两个参考值之间。
- Between,
-
字符串比较
以下示例演示了如何验证数据
<?php use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\Reader\ArrayAdapter; $validation = new Validation([ 'name' => 'required|min-length:3', 'email' => 'required|email!|unique', 'password' => 'required|min-length:6', 'consent' => 'required', ]); $errors = $validation->validate(new ArrayAdapter([ 'name' => "Ol", 'email' => "olivier", 'password' => "123", ])); var_dump($errors['name']); var_dump((string) reset($errors['name']));
array(1) {
[0] =>
class ICanBoogie\Validate\Message#582 (2) {
public $format =>
string(46) "should be at least {reference} characters long"
public $args =>
array(4) {
'attribute' =>
string(4) "name"
'value' =>
string(2) "Ol"
'validator' =>
string(39) "ICanBoogie\Validate\Validator\MinLength"
'reference' =>
string(1) "3"
}
}
}
string(36) "should be at least 3 characters long"
验证
使用键值对数组定义验证,其中键是验证的属性,值是规则。规则可以定义为字符串或键值对数组,其中键是验证器类或别名,值是参数和选项数组。可选地,您可以提供验证器提供者,如果没有提供,则默认创建一个BuiltinValidatorProvider实例。
验证由一个Validation实例表示。
<?php use ICanBoogie\Validate\Validation; $validation = new Validation([ 'name' => 'required|min-length:3', ]); # or $validation = new Validation([ 'name' => [ 'required' => [], 'min-length' => [ 3 ], ] ]); # or use ICanBoogie\Validate\Validator; $validation = new Validation([ 'name' => [ Validator\Required::class => [], Validator\MinLength::class => [ 3 ], ] ]); # or $validation = new Validation([ 'name' => [ Validator\Required::class => [], Validator\MinLength::class => [ Validator\MinLength::PARAM_REFERENCE => 3 ], ] ]);
空值,必填属性
请注意,验证器不会在空值上运行,除非同时使用了required
验证器。以下值被认为是空:null
、空数组、空剪裁字符串;但false
和0
被认为是有效值。
以下示例演示了required
如何影响验证
<?php use ICanBoogie\Validate\Reader\ArrayAdapter; use ICanBoogie\Validate\Validation; $validation = new Validation([ 'required_tz' => 'required|timezone', 'optional_tz' => 'timezone', ]); $errors =$validation->validate(new ArrayAdapter([ 'required_tz' => '', 'optional_tz' => '', ])); isset($errors['required_tz']); // true isset($errors['optional_tz']); // false
验证数据
validate()
方法验证数据。如果验证失败,则返回一个ValidationErrors实例,否则返回一个空数组。
<?php use ICanBoogie\Validate\Reader\RequestAdapter; use ICanBoogie\Validate\Validation; /* @var $validation Validation */ $errors = $validation->validate(new RequestAdapter($_POST)); if (!$errors) { // because `$errors` is an empty array we can check if it is empty with `!`. } foreach ($errors as $attribute => $messages) { // … }
断言数据有效
可以使用assert()
方法断言数据有效。与validate()
方法返回一个ValidationErrors实例不同,该方法会抛出一个ValidationFailed异常。可以使用异常的errors
属性检索验证错误。
<?php use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\ValidationFailed; use ICanBoogie\Validate\Reader\RequestAdapter; /* @var $validation Validation */ try { $validation->assert(new RequestAdapter($_POST)); } catch (ValidationFailed $e) { echo get_class($e->errors); // ICanBoogie\Validate\ValidationErrors }
特殊验证选项
以下验证选项可以定义:
-
ValidatorOptions::OPTION_MESSAGE
:自定义错误消息,该消息覆盖验证器默认消息。 -
ValidatorOptions::OPTION_IF
:只有当此选项定义的可调用返回true
时,验证器才会使用。可调用可以是闭包或实现IfCallable接口的实例。 -
ValidatorOptions::OPTION_UNLESS
:如果此选项定义的可调用返回true
,则跳过验证器。可调用可以是闭包或实现UnlessCallable接口的实例。 -
ValidatorOptions::OPTION_STOP_ON_ERROR
:如果为true
,则在发生错误后停止验证值的验证。对于Required验证器,此选项始终为true
。
<?php use ICanBoogie\Validate\Context; use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\Validator\Required; use ICanBoogie\Validate\Validator\Email; $validation = new Validation([ 'email' => [ Required::class => [ Required::OPTION_MESSAGE => "An email address must be supplied if your wish to register.", Required::OPTION_IF => function(Context $context) { return $context->value('name'); }, Required::OPTION_UNLESS => function(Context $context) { return !$context->value('register'); }, Required::OPTION_STOP_ON_ERROR => true // already defined by Require ], Email::class => [ Email::OPTION_MESSAGE => "`{value}` is an invalid email address for the field E-Mail.", ] ] ]);
验证上下文
验证上下文由一个Context实例表示,并与要验证的值一起传递给验证器。验证器可以使用上下文来检索参数和选项,并在需要时获取正在进行验证的完整情况。
以下属性可用
attribute
:正在验证的属性。value
:正在验证的属性的值。validator
:当前验证器。validator_params
:当前验证器的参数和选项。reader
:一个Reader适配器,提供对正在验证的值的访问。message
:当前验证器的可能错误消息。message_args
:可能错误消息的参数。errors
:收集到的错误。
以下示例演示了验证器如何从上下文中检索其参数和选项,以及如何从值读取器中检索一个值
<?php use ICanBoogie\Validate\Context; use ICanBoogie\Validate\Validator\ValidatorAbstract; class SampleValidator extends ValidatorAbstract { const PARAM_REFERENCE = 'reference'; const OPTION_STRICT = 'strict'; /** * @inheritdoc */ public function validate($value, Context $context) { $reference = $context->param(self::PARAM_REFERENCE); $strict = $context->option(self::OPTION_STRICT, false); $other_value = $context->value('some_other_value'); } }
验证器提供程序
通过使用验证器提供程序来获取验证器实例。默认情况下,使用BuiltinValidatorProvider的实例,但您可以提供自己的提供程序,或者更好的是,一个提供程序集合。
以下示例演示了如何使用内置提供程序
<?php use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\ValidatorProvider\BuiltinValidatorProvider; /* @var $rules array */ $builtin_validator_provider = new BuiltinValidatorProvider; $validation = new Validation($rules, $builtin_validator_provider); # or $validation = new Validation($rules);
以下示例演示了如何提供自己的sample
验证器
<?php use ICanBoogie\Validate\UndefinedValidator; use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\Validator; /* @var $sample_validator Validator */ $rules = [ 'attribute' => $sample_validator::ALIAS ]; $sample_validator_provider = function ($class_or_alias) use ($sample_validator) { switch ($class_or_alias) { case get_class($sample_validator): case $sample_validator::ALIAS: return $sample_validator; default: throw new UndefinedValidator($class_or_alias); } }; $validation = new Validation($rules, $sample_validator_provider);
以下示例演示了如何使用容器提供验证器
<?php use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\ValidatorProvider\ContainerValidatorProvider; use Psr\Container\ContainerInterface; /* @var $rules array */ /* @var $container ContainerInterface */ $prefix = 'validator.'; $container_validator_provider = new ContainerValidatorProvider($container, $prefix); $validation = new Validation($rules, $container_validator_provider);
以下示例演示了如何将多个提供程序作为集合使用
<?php use ICanBoogie\Validate\Validation; use ICanBoogie\Validate\ValidatorProvider\BuiltinValidatorProvider; use ICanBoogie\Validate\ValidatorProvider\ContainerValidatorProvider; use ICanBoogie\Validate\ValidatorProvider\ValidatorProviderCollection; /* @var $rules array */ /* @var $container_validator_provider ContainerValidatorProvider */ /* @var $sample_validator_provider callable */ /* @var $builtin_validator_provider BuiltinValidatorProvider */ $validator_provider_collection = new ValidatorProviderCollection([ $container_validator_provider, $sample_validator_provider, $builtin_validator_provider, ]); $validation = new Validation($rules, $validator_provider_collection);
要求
此包需要PHP 5.5或更高版本。
安装
安装此包的推荐方法是使用Composer。
$ composer require icanboogie/validate
克隆存储库
该包可在GitHub上找到,其存储库可以使用以下命令行克隆
$ git clone https://github.com/ICanBoogie/validate.git
文档
该包作为ICanBoogie框架的一部分进行文档记录。文档。您可以使用make doc
命令生成包及其依赖项的文档。文档生成在build/docs
目录中。ApiGen是必需的。可以使用make clean
命令清理该目录。
测试
使用make test
命令运行测试套件。PHPUnit和Composer需要全局可用才能运行套件。该命令根据需要安装依赖项。使用make test-coverage
命令运行测试套件,并在build/coverage
中创建HTML覆盖率报告。可以使用make clean
命令清理该目录。
该包由Travis CI持续测试。
许可证
icanboogie/validate受新BSD许可证的许可 - 有关详细信息,请参阅LICENSE文件。