27.2. Цепочки валидаторов
Пред. | Глава 27. Zend_Validate | След.

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

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

    <?php
    // Предоставляет возможность создания цепочек валидаторов
    require_once 'Zend/Validate.php';

    // Валидаторы, нужные для примера
    require_once 'Zend/Validate/StringLength.php';
    require_once 'Zend/Validate/Alnum.php';

    // Создает цепочку валидаторов и добавляет валидаторы в нее
    $validatorChain = new Zend_Validate();
    $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
                   ->addValidator(new Zend_Validate_Alnum());

    // Валидация имени пользователя
    if ($validatorChain->isValid($username)) {
        // имя пользователя прошло валидацию
    } else {
        // имя пользователя не прошло валидацию; вывод причин этого
        foreach ($validatorChain->getMessages() as $message) {
            echo "$message\n";
        }
    }

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

В некоторых случаях имеет смысл прерывать валидацию, если данные не прошли проверку каким-либо валидатором в цепочке. `Zend_Validate` поддерживает такие случаи использования с помощью второго параметра метода `addValidator()`. При установке `$breakChainOnFailure` в `true`, добавленный валидатор будет прерывать выполнение цепочки валидаций в случае неудачи, что позволяет избежать выполнение других валидаций, которые были бы неуместными в такой ситуации. В примере, переписанном как показано ниже, проверка на алфавитно-цифровые символы не должна производиться, если не была пройдена проверка на длину строки.

    <?php
    $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
                   ->addValidator(new Zend_Validate_Alnum());

Любые объекты, реализующие `Zend_Validate_Interface`, могут быть использованы в цепочке валидаторов.

Пред. | Уровень выше | След.
Глава 27. Zend_Validate | Начало | 27.3. написание валидаторов