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

    <title>Validator Chains</title>

    <para>
        Often multiple validations should be applied to some value in a particular order. The following code
        demonstrates a way to solve the example from the
        <link linkend="zend.validate.introduction">introduction</link>, where a username must be between 6 and
        12 alphanumeric characters:

        <programlisting role="php"><![CDATA[
// Create a validator chain and add validators to it
$validatorChain = new Zend_Validate();
$validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
               ->addValidator(new Zend_Validate_Alnum());

// Validate the username
if ($validatorChain->isValid($username)) {
    // username passed validation
} else {
    // username failed validation; print reasons
    foreach ($validatorChain->getMessages() as $message) {
        echo "$message\n";
    }
}
]]></programlisting>

        Validators are run in the order they were added to <classname>Zend_Validate</classname>. In the above example,
        the username is first checked to ensure that its length is between 6 and 12 characters, and then it is
        checked to ensure that it contains only alphanumeric characters. The second validation, for
        alphanumeric characters, is performed regardless of whether the first validation, for length between 6
        and 12 characters, succeeds. This means that if both validations fail, <code>getMessages()</code> will
        return failure messages from both validators.
    </para>

    <para>
        In some cases it makes sense to have a validator break the chain if its validation process
        fails. <classname>Zend_Validate</classname> supports such use cases with the second parameter to the
        <code>addValidator()</code> method. By setting <code>$breakChainOnFailure</code> to <code>true</code>,
        the added validator will break the chain execution upon failure, which avoids running any other
        validations that are determined to be unnecessary or inappropriate for the situation. If the above
        example were written as follows, then the alphanumeric validation would not occur if the string length
        validation fails:

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

    </para>

    <para>
        Any object that implements <classname>Zend_Validate_Interface</classname> may be used in a validator chain.
    </para>

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