<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.validate.validator_chains">

    <title>Цепочки валидаторов</title>

    <para>
        Часто к одному и тому же значению должно быть применено несколько
        валидаций в определенном порядке. Следующий код демонстрирует способ
        решения примера из
        <link linkend="zend.validate.introduction">введения</link>, где имя
        пользователя должно быть длиной от 6 до 12 символов и состоять только из
        алфавитно-цифровых символов:

        <programlisting language="php"><![CDATA[
// Создает цепочку валидаторов и добавляет валидаторы в нее
$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";
    }
}
]]></programlisting>

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

    <para>
        В некоторых случаях имеет смысл прерывать валидацию, если данные не
        прошли проверку каким-либо валидатором в цепочке.
        <classname>Zend_Validate</classname> обеспечивает эту возможность с
        помощью второго параметра метода <code>addValidator()</code>. При
        установке <varname>$breakChainOnFailure</varname> в <constant>TRUE</constant>,
        добавленный валидатор будет прерывать выполнение цепочки валидаций в
        случае неудачи. Это позволяет избежать выполнения других валидаций,
        которые были бы излишними или неподходящими в данной ситуации.
        Ниже приводится переписанный пример, в котором проверка на
        алфавитно-цифровые символы не должна
        производиться, если не была пройдена проверка на длину строки:

        <programlisting language="php"><![CDATA[
$validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
        ->addValidator(new Zend_Validate_Alnum());
]]></programlisting>

    </para>

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

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
