如何使用
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); }
最终得到这个输出:
D:\Users\Bubba\git\Validation\bin>PHP test.PHP array(2) { ["bar"]=> string(22) "Bubba's Custom Length!" ["baz"]=> string(21) "Custom alnum message." }
那很有趣!