Вы не можете связать их вместе и получить специальное сообщение, потому что последнее настраиваемое сообщение, которое вы вызываете, будет просто назначено на набор правил, а не отдельные правила из-за реализации цепочки.
Для продемонстрировал это, я клонировали его от мерзавца, создал каталог 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, world!',
));
} catch (Respect\Validation\Exceptions\ValidationException $exception) {
$errors = $exception->findMessages(array(
'bar',
'baz',
));
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, $ruleType, $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', 'Alnum', 'Bubba\'s Custom Alnum!');
$chained->setValidatorRuleName('foo', 'Length', 'bar');
$chained->setValidatorRuleTemplate('foo', 'Length', 'Bubba\'s Custom Length!');
$chained->assert(array(
'foo' => 'Hello, world!',
));
} catch (Respect\Validation\Exceptions\ValidationException $exception) {
$errors = $exception->findMessages(array(
'bar',
'baz',
));
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." }
Это было весело!
1. Глупый вопрос, но сколько лет ваша структура Respect, поскольку, похоже, произошла ошибка с функцией 'setTemplate()' год назад или около того », _ когда создается исключение, он проверяет, является ли шаблон есть, но он возвращается как null_ "https://github.com/Respect/Validation/issues/64. 2. Я не мог найти какой-либо docco для этой функции, он предназначен как часть публичного API (и, следовательно, знаете ли вы, что этот _should_ работает так, как вы ожидаете)? 3. Вы пробовали разные валидаторы в комбинации? например, всегда ли это только последний, который добавляет свой msg? – Sepster
4. Просто из интереса вы получаете ожидаемый результат от 'getFullMessage();' в соответствии с [Informative Excpetions] (http://documentup.com/Respect/Validation/#feature-guide/informative-exceptions) в docco? Это может по крайней мере дать представление о том, является ли сообщение _within_ исключением, которое было потеряно, или просто ошибка, выдающая исключение. – Sepster
@Sepster 1. Я использую последнюю версию dev-master. 2.Я нашел функцию, просмотрев код, это общедоступный метод, поэтому можно было бы считать его частью публичного API. 3. Да, он всегда будет последним валидатором в цепочке. 4. 'getFullMessage()' выводит сообщения по умолчанию, а не пользовательские. – Petah