asgard / validation
Requires
- php: >=5.5.9
- asgard/common: ~0.3.0
Requires (Dev)
- symfony/translation: ^3.0
Suggests
- symfony/translation: ^3.0
This package is not auto-updated.
Last update: 2024-09-14 15:11:14 UTC
README
#Validation
##安装 如果您正在处理一个Asgard项目,则不需要安装此库,因为它已经是标准库的一部分。
composer require asgard/validation 0.*
#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 许可协议 许可。