TigerZF
🌐Español

76.3. Cadenas de validadores

A menudo se deben aplicar múltiples validaciones a un valor en un orden particular. El siguiente código demuestra una forma de resolver el ejemplo de la introducción, donde un nombre de usuario debe tener entre 6 y 12 caracteres alfanuméricos:

// Create a validator chain and add validators to it
$validatorChain = new Zend_Validate();
$validatorChain->addValidator(
                    new Zend_Validate_StringLength(array('min' => 6,
                                                         'max' => 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";
    }
}

Los validadores se ejecutan en el orden en que fueron añadidos a Zend_Validate. En el ejemplo anterior, primero se comprueba que la longitud del nombre de usuario esté entre 6 y 12 caracteres, y luego se comprueba que contenga solo caracteres alfanuméricos. La segunda validación, para caracteres alfanuméricos, se realiza independientemente de si la primera validación, para la longitud entre 6 y 12 caracteres, tiene éxito. Esto significa que si ambas validaciones fallan, getMessages() devolverá los mensajes de fallo de ambos validadores.

En algunos casos tiene sentido que un validador rompa la cadena si su proceso de validación falla. Zend_Validate admite tales casos de uso con el segundo parámetro del método addValidator(). Al establecer $breakChainOnFailure en TRUE, el validador añadido romperá la ejecución de la cadena en caso de fallo, lo que evita ejecutar otras validaciones que se determinen innecesarias o inapropiadas para la situación. Si el ejemplo anterior se escribiera de la siguiente manera, entonces la validación alfanumérica no se ejecutaría si la validación de longitud de cadena falla:

$validatorChain->addValidator(
                    new Zend_Validate_StringLength(array('min' => 6,
                                                         'max' => 12)),
                    true)
               ->addValidator(new Zend_Validate_Alnum());

Cualquier objeto que implemente Zend_Validate_Interface puede usarse en una cadena de validadores.