如何使用
Respect Validation有多个自定义错误消息.
我有一些输入,我想针对多个验证器进行验证.我希望每个验证都有一个自定义错误消息.
这是我试过的:
- try {
- Respect\Validation\Validator::create()
- ->key('foo',v::length(20)->setName('bar')->setTemplate('Custom length message.')
- ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
- )
- ->assert([
- 'foo' => 'Hello,world!',]);
- } catch (Respect\Validation\Exceptions\ValidationException $exception) {
- $errors = $exception->findMessages([
- 'bar','baz',]);
- var_dump($errors);
- }
输出是:
- array (size=2)
- 'bar' => string '' (length=0)
- 'baz' => string 'Custom alnum message.' (length=21)
Idealy我可以获得1个输入的消息数组,如:
- var_dump($exception->findMessages(['foo']));
会给我:
- array (size=1)
- 'foo' =>
- array (size=2)
- 0 => string 'Custom length message.' (length=22)
- 1 => string 'Custom alnum message.' (length=21)
这个问题看起来像是杂草.
您不能将它们链接在一起并获取自定义消息,因为您调用的最后一个自定义消息将被简单地分配给规则集,而不是由于链接的实现而导致的单个规则.
为了证明这一点,我从git克隆了它,创建了一个bin目录,并用这个test.PHP稍微修改了你的样本
- <?PHP
- set_include_path(implode(PATH_SEPARATOR,array(
- realpath('../library')
- )));
- function __autoload($class_name) {
- include $class_name . '.PHP';
- }
- use Respect\Validation\Validator as v;
- try {
- $chained = Respect\Validation\Validator::create()
- ->key('foo',v::length(20)->setName('bar')->setTemplate('Custom length message.')
- ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
- );
- print_r($chained);
- $chained->assert(array(
- 'foo' => 'Hello,));
- } catch (Respect\Validation\Exceptions\ValidationException $exception) {
- $errors = $exception->findMessages(array(
- 'bar',));
- var_dump($errors);
- }
- the print_r($chained) shows us:
- Respect\Validation\Validator Object
- (
- [rules:protected] => Array
- (
- [00000000791c0e000000000030f3f15e] => Respect\Validation\Rules\Key Object
- (
- [mandatory] => 1
- [reference] => foo
- [validator] => Respect\Validation\Validator Object
- (
- [rules:protected] => Array
- (
- [00000000791c0e030000000030f3f15e] => Respect\Validation\Rules\Length Object
- (
- [minValue] => 20
- [maxValue] =>
- [inclusive] => 1
- [name:protected] =>
- [template:protected] =>
- )
- [00000000791c0e020000000030f3f15e] => Respect\Validation\Rules\Alnum Object
- (
- [additionalChars] =>
- [stringFormat] => /^(\s|[a-zA-Z0-9])*$/
- [name:protected] =>
- [template:protected] =>
- )
- )
- [name:protected] => baz
- [template:protected] => Custom alnum message.
- )
- [name:protected] => foo
- [template:protected] =>
- )
- )
- [name:protected] =>
- [template:protected] =>
- )
您可能会注意到规则集选取了姓氏以及传入的最后一个模板,并且两个实际验证对象都没有获取名称或模板.我没有在图书馆看到任何方法来实际做你想做的事情.
所以我决定采取行动.在我的../bin目录中,我创建了这个类,扩展了Valditor类.
- <?PHP
- use Respect\Validation\Validator as v;
- class BubbaValidator extends v {
- public function getRuleset($rulename = null){
- if (is_null($rulename)) return $this->rules;
- foreach ($this->rules as $rule){
- if ($rule->getName() == $rulename){
- return $rule;
- }
- }
- }
- public function getValidatorRules($rulesetName,$ruleType=null){
- $ruleset = $this->getRuleset($rulesetName);
- $validators = $ruleset->validator;
- if (is_null($ruleType)){
- return $validators;
- }
- foreach ($validators->rules as $key=>$validator){
- if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
- $validator->name = "bar";
- $validator->template = "bubba rocks";
- $validators->rules[$key]->name = "bar";
- $validators->rules[$key]->template = "bubba rocks";
- return $validator;
- }
- }
- }
- public function setValidatorRuleName($rulesetName,$ruleType,$name){
- $ruleset = $this->getRuleset($rulesetName);
- $validators = $ruleset->validator;
- foreach ($validators->rules as $key=>$validator){
- if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
- $validators->rules[$key]->name = $name;
- return $validator;
- }
- }
- }
- public function setValidatorRuleTemplate($rulesetName,$template){
- $ruleset = $this->getRuleset($rulesetName);
- $validators = $ruleset->validator;
- foreach ($validators->rules as $key=>$validator){
- if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
- $validators->rules[$key]->template = $template;
- return $validator;
- }
- }
- }
- }
然后我修改了脚本并运行它
- <?PHP
- set_include_path(implode(PATH_SEPARATOR,array(
- realpath('../library'),realpath(__DIR__)
- )));
- function __autoload($class_name) {
- include $class_name . '.PHP';
- }
- use BubbaValidator as v;
- try {
- $chained = new BubbaValidator();
- $chained->key('foo',v::length(20)->setName('bar')->setTemplate('Custom length message.')
- ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
- );
- $chained->setValidatorRuleName('foo','Alnum','baz');
- $chained->setValidatorRuleTemplate('foo','Bubba\'s Custom Alnum!');
- $chained->setValidatorRuleName('foo','Length','bar');
- $chained->setValidatorRuleTemplate('foo','Bubba\'s Custom Length!');
- $chained->assert(array(
- 'foo' => 'Hello,));
- var_dump($errors);
- }
最终得到这个输出:
那很有趣!