Содержание


Цепочки валидаторов


Validator Chains, Валидация, ЗФ2, Zend Framework 2, ZF2, ру, ru




Часто несколько валидаторов нужно применить к некоторому значению в определенном порядке. Следующий код демонстрирует способ решить пример из introduction, где имя пользователя должно быть в диапазоне от 6 до 12 буквенно-цифровых символов:

// Создать цепочку валидаторов и добавить в нее валидаторы
$validatorChain = new Zend\Validator\ValidatorChain();
$validatorChain->attach(
                    new Zend\Validator\StringLength(array('min' => 6,
                                                         'max' => 12)))
               ->attach(new Zend\Validator\Alnum());
 
// Проверить имя пользователя
if ($validatorChain->isValid($username)) {
    // имя пользователя прошло валидацию
} else {
    // имя пользователя не прошло валидацию; печатать причины
    foreach ($validatorChain->getMessages() as $message) {
        echo "$messagen";
    }
 

Валидаторы выполняются в порядке их добавления в Zend\Validator\ValidatorChain. В приведенном выше примере имя пользователя сначала проверяется, чтобы убедиться, что его длина лежит в диапазоне между 6 и 12 символами, а затем проверяется, что оно содержит только буквенно-цифровые символы. Вторая проверка, для буквенно-цифровых символов, выполняется независимо от результатов первой проверки на длину в диапазоне между 6 и 12 символами. Это значит, что в случае, если обе проверки потерпели неудачу,  getMessages() будет возвращать сообщения об ошибках с обоих валидаторов.

 

В некоторых случаях имеет смысл позволить валидатору разорвать цепочку, если процесс проверки потерпел неудачу. Zend\Validator\ValidatorChain поддерживает такие случаи использования с помощью второго аргумента метода attach(). Если установить $breakChainOnFailure в TRUE, добавленный валидатор будет прерывать выполнение цепочки в случае провала, что позволяет избежать выполнения остальных проверок, которые будут определены, как ненужные или неуместные в данной ситуации. Если приведенный выше пример будет записан подобным образом, буквенно-цифровая проверка не будет происходить в случае, если проверка длины строки потерпит неудачу:

$validatorChain->attach(
                    new Zend\Validator\StringLength(array('min' => 6,
                                                         'max' => 12)),
                    true)
               ->attach(new Zend\Validator\Alnum());
 

Любой объект, реализующий интерфейс Zend\Validator\ValidatorInterface может быть использован в цепочке валидации.