asgard/validation

v0.3.1 2016-05-13 11:31 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:11:14 UTC


README

#Validation

Build Status

##安装 如果您正在处理一个Asgard项目,则不需要安装此库,因为它已经是标准库的一部分。

composer require asgard/validation 0.*

##Validator 在Asgard框架中的使用

#rulesRegistry instance
$rulesRegistry = $container['rulesRegistry'];

#validator instance
$validator = $container->make('validator');

容器通常作为方法参数或通过 ContainerAware 对象访问。您也可以使用 singleton,但不建议这样做。

###在Asgard框架外使用

use Asgard\Validation\Validator;
use Asgard\Validation\RulesRegistry;
$rulesRegistry = new RulesRegistry();
$validator = new Validator();
$validator->setRegistry($rulesRegistry);

实例化rulesRegistry是可选的。如果不这样做,验证器将自动使用RulesRegistry singleton。

###添加规则

$validator->rule('min', 5);

多个参数

$validator->rule('between', [5, 10]);

一次性添加多个规则

$validator->rules([
	'min' => 5,
	'max' => 10,
]);

如果您没有提供任何参数,它默认为true,例如

$validator->rules(['required']);
#or chaining:
$validator->min(5)->max(10);

您也可以使用静态调用初始化验证器

Validator::min(5)->max(10); #returns object Validator

###验证属性 有时您需要验证数组并需要为某些属性使用特定规则。

一次性为属性添加多个规则

$validator->attribute('attr', ['min' => 5, 'max' => 10]);
#chaining:
$validator->attribute('attr')->min(5)->max(10);

为属性使用新的验证器

$v = Validator::min(5)->max(10);
$validator->attribute('attr', $v)

对于嵌套属性,使用点

$validator->attribute('attr.subattr.subsubattr', ['min' => 5, 'max' => 10]);
$validator->valid(['attr'=>['subattr'=>['subsubattr'=>7]]]); #returns true

###测试输入有效性 Validator::min(5)->valid(3); #返回false,小于5 Validator::min(5)->valid(7); #返回true,大于5

与属性一起使用

$v = $validator->attribute('attr')->min(5);
$v->valid(['attr'=>2]); #returns false
$v->valid(['attr'=>7]); #returns true

###验证组

$validator->rule('min', [5, 'groups'=>['default', 'registration']]);

$validator->valid(6, ['registration']);

默认情况下,如果没有指定组,规则仅属于“默认”组。

###验证输入数组 如果您想验证数组的所有元素

Validator::ruleEach('min', 5)->valid([4,5,6,7,8]); #returns false because of 4

使用规则而不是ruleEach,它将尝试将数组本身与5进行比较。

###简写语法

Validator::rule('lengthbetween:1,3|contains:c')->valid('ac'); #returns true
Validator::rule('lengthbetween:1,3|contains:c')->valid('aaaaac'); #returns false
Validator::rule('lengthbetween:1,3|contains:c')->valid('aa'); #returns false

###抛出异常

Validator::min(5)->assert(3); #throws \Asgard\Validation\ValidatorException

您可以通过以下方式访问错误

try {
	Validator::min(5)->assert(3);
} catch(\Asgard\Validation\ValidatorException $e) {
	$e->errors(); #returns a Asgard\Validation\ValidatorException object
}

###必填输入 要使输入必填,请使用规则 "required"

Validation::required()->valid(null) #returns false
Validation::required()->valid(5) #returns true

这将返回true

Validation::equal('123')->valid(null) #returns true
Validation::equal('123')->valid('') #returns true

因为如果输入为空且不是必填项,则不会将其与任何规则进行比较。

但是,您有时可能将其他类型的输入视为空。例如,一个空数组。为了做到这一点,请使用isNull

Validation::isNull(function($arr) { return count($arr)==0; })->valid([]); #returns true, because the input is empty and not required
Validation::contains(1)->valid([]); #returns false

有时要求取决于条件。例如,如果金额超过400,则可能需要支付。

$v->attribute('payment', ['required' => function($input, $parent, $validator) {
	return $parent->attribute('amount') >= 400;
}]);
$v->valid(['amount'=>300]); #true
$v->valid(['amount'=>500]); #false

###获取错误报告

$report = Validator::min(5)->errors(3); #returns a report (Asgard\Validation\ValidatorException)

您还可以获取针对某些验证组的特定错误

$validator->rule('min', [5, 'groups'=>['default']]);
$validator->rule('min', [10, 'groups'=>['payment']]);
$validator->errors(7, ['payment']);

###向验证器添加参数

$v->set('form', $form);

您可以在规则函数中访问参数

//...
	public function validate($input, \Asgard\Validation\InputBag $parentInput, \Asgard\Validation\Validator $validator) {
		$form = $validator->get('form');
		//...
	}
//...

如果属性验证器没有参数,它将询问其父级。

##错误报告 错误报告包含所有未通过规则的错误消息。报告中的属性包含其自己的嵌套报告。

要获取报告中的所有错误消息(不包括嵌套的)

$errors = $report->errors();

要获取主要错误消息

$error = $report->error();

要获取特定规则的错误消息

$error = $report->error('min');

要获取属性的第一个错误消息

$attrError = $report->first('attr');

要获取失败属性列表

$failed = $report->failed();

要导航报告

$r = $report->attribute('attr'); #returns the attribute report
$r->errors(); #returns all its errors
$r->error('min'); #returns specific rule error

如果您需要从不同的来源构建自己的报告,请设置属性报告

$attrReport = new Report(['min' => 'attr is to high.']);
$report->attribute('attr', $attrReport);

要获取所有嵌套属性报告

$errors = $report->attributes();

要检查报告是否有任何错误

$report->hasError(); #returns true or false

如果验证器有多个同名规则,报告将为每个名称添加一个递增的整数

Validator::contains('a')->contains('b')->errors('c')->errors();
# returns
[
	'contains' => '"c" must contain "a".',
	'contains-1' => '"c" must contain "b".',
]

要访问嵌套属性,请使用点号

$report->attribute('attr.substtr.subsubsttr')

##错误信息

###自定义消息 您可以为验证器规则指定一个或多个消息

$validator->ruleMessages([
	'min' => 'Must be over :min!',
	'max' => 'Must be below :max!',
]);
#or
$validator->ruleMessage('min', 'Must be over :min!');

或为RulesRegitry中的规则指定消息

$registry->messages([
	'min' => 'Must be over :min!',
	'max' => 'Must be below :max!',
]);
#or
$registry->message('min', 'Must be over :min!');

如果您没有做上面两项中的任何一项,验证器将通过调用规则的getMessage()方法来使用默认规则消息

public function getMessage() {
	return ':attribute must be greater than :min.';
}

如果规则没有自己的消息,验证器将通过您设置的默认错误消息来获取

$validator->setDefaultMessage(':attribute is wrong!');

最后,如果上述任何一项可用,它将返回消息:“:attribute不是有效的。”

###消息参数 如您所见,消息具有参数,如:attribute,:input等。

  • 参数:attribute是属性名或输入本身。
  • 参数:input在输入是字符串或数字时可用。

然后是特定规则的参数。任何具有成员变量的规则都可以将其用作错误消息中的参数。例如,规则Asgard\Validation\Rule\Min有一个变量"min"。因此,您可以在其消息中使用参数:min:“:attribute必须大于:min。”

##输入包 所有规则都接收原始输入和父输入包。您可以使用输入包对象遍历整个输入

//...
	public function validate($input, \Asgard\Validation\InputBag $parentInput, \Asgard\Validation\Validator $validator) {
		return $input == $parentInput->attribute('^.confirm')->input();
	}
//..

符号 ^ 用于访问父节点,并通过点号分隔的属性列表向下遍历树。例如,对于输入 ['password'=>'abc', 'confirm'=>'zyx'],并在验证属性"password"时,前面的函数将访问"confirm"属性的值。

您可以使用以下方法检查属性是否存在

$parentInput->hasAttribute('^.confirm');

##规则 ###创建新规则 您可以通过rulesregistry创建新规则。可以使用默认实例或新实例

$rr = RulesRegistry::instance();

$rr = new RulesRegistry();
$validator = new Validator();
$validator->setRegistry($rr);

如果验证器没有自己的rulesregistry,它将像这里一样询问其父级

$validator->attribute('attr', Validator::min(5));

属性验证器将向主验证器请求rulesregistry。如果父级没有,它将使用默认的RulesRegistry实例。

###注册新规则

$rr->register('customrule', function($input) { /*...*/ });
$rr->register('customrule', 'Namespace\Rule\Customrule');
$rr->register('customrule', new \Namespace\Rule\Customrule(/* params */));

###注册命名空间 假设您想添加多个规则,所有规则都在同一命名空间中。您可以这样做

$rr->registerNamespace('Namespace\Rules');

在查找规则(如"customrule")时,rulesregistry将检查Namespace\Rule\Customrule类是否存在。

如果找不到规则,它将抛出异常。

###现有规则列表 所有:必须验证所有作为参数传递的验证器

Validator::all(v::contains('a'), v::contains('b'));

所有in:检查数组中的所有元素是否在另一个数组中

Validator::allin([1,2,3,4,5]);

任何:必须验证作为参数传递的规则中的任何一个

Validator::any(v::contains('a'), v::contains('b'));

回调:在lambda函数中使用自定义规则

Validator::callback(function($input) { return $input == 5; });
#or
Validator::rule(function($input) { return $input == 5; })

包含:字符串输入必须包含作为参数传递的子串

Validator::contains('a')

日期:必须是有效的日期(xxxx-xx-xx)

Validator::date()

每个:输入的每个属性都必须通过作为参数传递的验证器验证

Validator::each(v::min(5))->valid([4, 5, 6, 7]) #returns false because of 4

电子邮件:输入必须是电子邮件地址

Validator::email()

等于:输入必须等于作为参数传递的值

Validator::equal(12345)

小于:输入必须具有少于指定的元素

Validator::haslessthan(5)

大于:输入必须具有多于指定的元素

Validator::hasmorethan(5)

:输入必须在给定的数组中

Validator::in([1,2,4,5])

整数:输入必须是整数

Validator::int()

类型:输入必须是实例...

Validator::isinstanceof('Namespace\Class')

长度:输入必须具有"长度"个字符。

Validator::length(10)

长度介于:输入长度必须在最小和最大之间

Validator:lengthbetween(10, 20)

最小长度:输入长度必须大于或等于指定的值

Validator:minlength(10)

最大长度:输入长度必须小于或等于指定的值

Validator:maxlength(10)

最小值:输入必须大于最小值

Validator::min(5)

最大值:输入必须小于最大值

Validator::max(10)

正则表达式:输入必须匹配给定的模式

Validator::regex('/^[a-z]+$/')

必填

Validator::required()

相同:输入属性必须等于另一个属性

Validator::same('^.confirm')

### 贡献

请将所有问题和拉取请求提交到 asgardphp/asgard 仓库。

许可协议

Asgard 框架是开源软件,采用 MIT 许可协议 许可。