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

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

    // Создает цепочку валидаторов и добавляет валидаторы в нее
    $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`, добавленный валидатор будет прерывать выполнение цепочки валидаций в случае неудачи. Это позволяет избежать выполнения других валидаций, которые были бы излишними или неподходящими в данной ситуации. Ниже приводится переписанный пример, в котором проверка на алфавитно-цифровые символы не должна производиться, если не была пройдена проверка на длину строки:

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

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