TigerZF
🌐Español

Capítulo 76. Zend_Validate

Tabla de contenidos

76.1. Introducción
76.1.1. ¿Qué es un validador?
76.1.2. Uso básico de los validadores
76.1.3. Personalizar los mensajes
76.1.4. Uso del método estático is()
76.1.4.1. Espacios de nombres
76.1.5. Traducción de mensajes
76.2. Clases de validación estándar
76.2.1. Alnum
76.2.1.1. Opciones soportadas para Zend_Validate_Alnum
76.2.1.2. Uso básico
76.2.1.3. Uso de espacios en blanco
76.2.1.4. Uso de diferentes idiomas
76.2.2. Alpha
76.2.2.1. Opciones soportadas para Zend_Validate_Alpha
76.2.2.2. Uso básico
76.2.2.3. Uso de espacios en blanco
76.2.2.4. Uso de diferentes idiomas
76.2.3. Barcode
76.2.3.1. Opciones soportadas para Zend_Validate_Barcode
76.2.3.2. Uso básico
76.2.3.3. Suma de comprobación opcional
76.2.3.4. Escribir adaptadores personalizados
76.2.4. Between
76.2.4.1. Opciones soportadas para Zend_Validate_Between
76.2.4.2. Comportamiento por defecto de Zend_Validate_Between
76.2.4.3. Validación excluyendo los valores límite
76.2.5. Callback
76.2.5.1. Opciones soportadas para Zend_Validate_Callback
76.2.5.2. Uso básico
76.2.5.3. Uso con clausuras (closures)
76.2.5.4. Uso con callbacks basados en clases
76.2.5.5. Agregar opciones
76.2.6. CreditCard
76.2.6.1. Opciones soportadas para Zend_Validate_CreditCard
76.2.6.2. Uso básico
76.2.6.3. Aceptar tarjetas de crédito definidas
76.2.6.4. Validación usando APIs externas
76.2.7. Ccnum
76.2.8. Date
76.2.8.1. Opciones soportadas para Zend_Validate_Date
76.2.8.2. Validación de fecha por defecto
76.2.8.3. Validación de fecha localizada
76.2.8.4. Validación de fecha autodefinida
76.2.9. Db_RecordExists y Db_NoRecordExists
76.2.9.1. Opciones soportadas para Zend_Validate_Db_*
76.2.9.2. Uso básico
76.2.9.3. Excluir registros
76.2.9.4. Adaptadores de base de datos
76.2.9.5. Esquemas de base de datos
76.2.10. Digits
76.2.10.1. Opciones soportadas para Zend_Validate_Digits
76.2.10.2. Validación de dígitos
76.2.11. EmailAddress
76.2.11.1. Uso básico
76.2.11.2. Opciones para validar direcciones de correo electrónico
76.2.11.3. Partes locales complejas
76.2.11.4. Validar solo la parte local
76.2.11.5. Validación de distintos tipos de nombres de host
76.2.11.6. Comprobar si el nombre de host acepta realmente correo
76.2.11.7. Validación de nombres de dominio internacionales
76.2.11.8. Validación de dominios de nivel superior
76.2.11.9. Configurar mensajes
76.2.12. Float
76.2.12.1. Opciones soportadas para Zend_Validate_Float
76.2.12.2. Validación simple de números flotantes
76.2.12.3. Validación localizada de números flotantes
76.2.13. GreaterThan
76.2.13.1. Opciones soportadas para Zend_Validate_GreaterThan
76.2.13.2. Uso básico
76.2.14. Hex
76.2.14.1. Opciones soportadas para Zend_Validate_Hex
76.2.15. Hostname
76.2.15.1. Opciones soportadas para Zend_Validate_Hostname
76.2.15.2. Uso básico
76.2.15.3. Validación de distintos tipos de nombres de host
76.2.15.4. Validación de nombres de dominio internacionales
76.2.15.5. Validación de dominios de nivel superior
76.2.16. Iban
76.2.16.1. Opciones soportadas para Zend_Validate_Iban
76.2.16.2. Validación de IBAN
76.2.16.2.1. Configuración regional de toda la aplicación
76.2.16.2.2. Validación de IBAN no restrictiva
76.2.16.2.3. Validación de IBAN consciente de la región
76.2.17. Identical
76.2.17.1. Opciones soportadas para Zend_Validate_Identical
76.2.17.2. Uso básico
76.2.17.3. Objetos idénticos
76.2.17.4. Elementos de formulario
76.2.17.5. Validación estricta
76.2.17.6. Configuración
76.2.18. InArray
76.2.18.1. Opciones soportadas para Zend_Validate_InArray
76.2.18.2. Validación simple de arrays
76.2.18.3. Validación estricta de arrays
76.2.18.4. Validación recursiva de arrays
76.2.19. Int
76.2.19.1. Opciones soportadas para Zend_Validate_Int
76.2.19.2. Validación simple de enteros
76.2.19.3. Validación localizada de enteros
76.2.20. Ip
76.2.20.1. Opciones soportadas para Zend_Validate_Ip
76.2.20.2. Uso básico
76.2.20.3. Validar IPv4 o IPv6 por separado
76.2.21. Isbn
76.2.21.1. Opciones soportadas para Zend_Validate_Isbn
76.2.21.2. Uso básico
76.2.21.3. Configurar un tipo de validación ISBN explícito
76.2.21.4. Especificar una restricción de separador
76.2.22. LessThan
76.2.22.1. Opciones soportadas para Zend_Validate_LessThan
76.2.22.2. Uso básico
76.2.23. NotEmpty
76.2.23.1. Opciones soportadas para Zend_Validate_NotEmpty
76.2.23.2. Comportamiento por defecto de Zend_Validate_NotEmpty
76.2.23.3. Cambiar el comportamiento de Zend_Validate_NotEmpty
76.2.24. PostCode
76.2.24.1. Opciones del constructor
76.2.24.2. Opciones soportadas para Zend_Validate_PostCode
76.2.25. Regex
76.2.25.1. Opciones soportadas para Zend_Validate_Regex
76.2.25.2. Validación con Zend_Validate_Regex
76.2.25.3. Manejo de patrones
76.2.26. Validadores de Sitemap
76.2.26.1. Sitemap_Changefreq
76.2.26.2. Sitemap_Lastmod
76.2.26.3. Sitemap_Loc
76.2.26.4. Sitemap_Priority
76.2.26.5. Opciones soportadas para Zend_Validate_Sitemap_*
76.2.27. StringLength
76.2.27.1. Opciones soportadas para Zend_Validate_StringLength
76.2.27.2. Comportamiento por defecto de Zend_Validate_StringLength
76.2.27.3. Limitar la longitud máxima permitida de una cadena
76.2.27.4. Limitar la longitud mínima requerida de una cadena
76.2.27.5. Limitar una cadena por ambos lados
76.2.27.6. Codificación de valores
76.3. Cadenas de validadores
76.4. Escribir validadores
76.5. Mensajes de validación
76.5.1. Uso de mensajes de validación pretraducidos
76.5.2. Limitar el tamaño de un mensaje de validación

76.1. Introducción

El componente Zend_Validate proporciona un conjunto de validadores de uso común. También proporciona un mecanismo simple de encadenamiento de validadores mediante el cual se pueden aplicar múltiples validadores a un solo dato en un orden definido por el usuario.

76.1.1. ¿Qué es un validador?

Un validador examina su entrada respecto a algunos requisitos y produce un resultado booleano, es decir, si la entrada valida correctamente contra los requisitos. Si la entrada no cumple con los requisitos, un validador puede además proporcionar información sobre qué requisito(s) no cumple la entrada.

Por ejemplo, una aplicación web podría requerir que un nombre de usuario tenga entre seis y doce caracteres de longitud y que solo contenga caracteres alfanuméricos. Se puede utilizar un validador para asegurar que los nombres de usuario cumplan con estos requisitos. Si un nombre de usuario elegido no cumple uno o ambos requisitos, sería útil saber cuál de los requisitos no cumple el nombre de usuario.

76.1.2. Uso básico de los validadores

Haber definido la validación de esta manera proporciona la base para Zend_Validate_Interface, que define dos métodos, isValid() y getMessages(). El método isValid() realiza la validación sobre el valor proporcionado, devolviendo TRUE si y solo si el valor pasa el criterio de validación.

Si isValid() devuelve FALSE, el método getMessages() devuelve un array de mensajes que explican las razones del fallo de validación. Las claves del array son cadenas cortas que identifican las razones del fallo de validación, y los valores del array son los mensajes de texto legibles por humanos correspondientes. Las claves y los valores dependen de la clase; cada clase de validación define su propio conjunto de mensajes de fallo de validación y las claves únicas que los identifican. Cada clase también tiene una definición de constante que coincide con cada identificador de causa de fallo de validación.

[Note] Nota

Los métodos getMessages() devuelven información de fallo de validación solo para la llamada más reciente a isValid(). Cada llamada a isValid() elimina cualquier mensaje y error causado por una llamada anterior a isValid(), porque es probable que cada llamada a isValid() se realice para un valor de entrada diferente.

El siguiente ejemplo ilustra la validación de una dirección de correo electrónico:

$validator = new Zend_Validate_EmailAddress();

if ($validator->isValid($email)) {
    // email appears to be valid
} else {
    // email is invalid; print the reasons
    foreach ($validator->getMessages() as $messageId => $message) {
        echo "Validation failure '$messageId': $message\n";
    }
}

76.1.3. Personalizar los mensajes

Las clases de validación proporcionan un método setMessage() con el cual se puede especificar el formato de un mensaje devuelto por getMessages() en caso de fallo de validación. El primer argumento de este método es una cadena que contiene el mensaje de error. Se pueden incluir tokens en esta cadena que serán sustituidos con datos relevantes para el validador. El token %value% es soportado por todos los validadores; este se sustituye con el valor que se pasó a isValid(). Otros tokens pueden ser soportados caso por caso en cada clase de validación. Por ejemplo, %max% es un token soportado por Zend_Validate_LessThan. El método getMessageVariables() devuelve un array de tokens de variables soportados por el validador.

El segundo argumento opcional es una cadena que identifica la plantilla del mensaje de fallo de validación que se va a establecer, lo cual es útil cuando una clase de validación define más de una causa de fallo. Si se omite el segundo argumento, setMessage() asume que el mensaje especificado debe utilizarse para la primera plantilla de mensaje declarada en la clase de validación. Muchas clases de validación solo tienen una plantilla de mensaje de error definida, por lo que no es necesario especificar qué plantilla de mensaje se está cambiando.

$validator = new Zend_Validate_StringLength(8);

$validator->setMessage(
    'The string \'%value%\' is too short; it must be at least %min% ' .
    'characters',
    Zend_Validate_StringLength::TOO_SHORT);

if (!$validator->isValid('word')) {
    $messages = $validator->getMessages();
    echo current($messages);

    // "The string 'word' is too short; it must be at least 8 characters"
}

Se pueden establecer múltiples mensajes utilizando el método setMessages(). Su argumento es un array que contiene pares clave/mensaje.

$validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));

$validator->setMessages( array(
    Zend_Validate_StringLength::TOO_SHORT =>
        'The string \'%value%\' is too short',
    Zend_Validate_StringLength::TOO_LONG  =>
        'The string \'%value%\' is too long'
));

Si su aplicación requiere aún mayor flexibilidad al informar sobre los fallos de validación, se puede acceder a las propiedades con el mismo nombre que los tokens de mensaje soportados por una clase de validación dada. La propiedad value siempre está disponible en un validador; es el valor que se especificó como argumento de isValid(). Otras propiedades pueden ser soportadas caso por caso en cada clase de validación.

$validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));

if (!validator->isValid('word')) {
    echo 'Word failed: '
        . $validator->value
        . '; its length is not between '
        . $validator->min
        . ' and '
        . $validator->max
        . "\n";
}

76.1.4. Uso del método estático is()

Si resulta poco conveniente cargar una clase de validación dada y crear una instancia del validador, se puede usar el método estático Zend_Validate::is() como un estilo alternativo de invocación. El primer argumento de este método es un valor de entrada de datos, que se pasaría al método isValid(). El segundo argumento es una cadena, que corresponde al nombre base de la clase de validación, relativo al espacio de nombres Zend_Validate. El método is() carga automáticamente la clase, crea una instancia, y aplica el método isValid() al valor de entrada de datos.

if (Zend_Validate::is($email, 'EmailAddress')) {
    // Yes, email appears to be valid
}

También se puede pasar un array de argumentos del constructor, si son necesarios para el validador.

if (Zend_Validate::is($value, 'Between', array('min' => 1, 'max' => 12))) {
    // Yes, $value is between 1 and 12
}

El método is() devuelve un valor booleano, igual que el método isValid(). Al usar el método estático is(), los mensajes de fallo de validación no están disponibles.

El uso estático puede ser conveniente para invocar un validador de forma puntual, pero si se necesita ejecutar un validador para múltiples entradas, es más eficiente usar el uso no estático, creando una instancia del objeto validador y llamando a su método isValid().

Además, la clase Zend_Filter_Input permite instanciar y ejecutar múltiples clases de filtro y validación bajo demanda para procesar conjuntos de datos de entrada. Vea Zend_Filter_Input.

76.1.4.1. Espacios de nombres

Al trabajar con validadores autodefinidos se puede pasar un cuarto parámetro a Zend_Validate::is() que es el espacio de nombres donde se puede encontrar el validador propio.

if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12),
                      array('FirstNamespace', 'SecondNamespace')) {
    // Yes, $value is ok
}

Zend_Validate también permite establecer espacios de nombres por defecto. Esto significa que se pueden establecer una vez en el arranque de la aplicación y no volver a indicarlos en cada llamada a Zend_Validate::is(). El siguiente fragmento de código es idéntico al anterior.

Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12)) {
    // Yes, $value is ok
}

if (Zend_Validate::is($value,
                      'OtherValidator',
                      array('min' => 1, 'max' => 12)) {
    // Yes, $value is ok
}

Para su conveniencia existen los siguientes métodos que permiten el manejo de espacios de nombres:

  • Zend_Validate::getDefaultNamespaces(): Devuelve todos los espacios de nombres por defecto establecidos como array.

  • Zend_Validate::setDefaultNamespaces(): Establece nuevos espacios de nombres por defecto y sobrescribe cualquier valor anterior. Acepta ya sea una cadena para un único espacio de nombres o un array para múltiples espacios de nombres.

  • Zend_Validate::addDefaultNamespaces(): Agrega espacios de nombres adicionales a los ya establecidos. Acepta ya sea una cadena para un único espacio de nombres o un array para múltiples espacios de nombres.

  • Zend_Validate::hasDefaultNamespaces(): Devuelve TRUE cuando uno o más espacios de nombres por defecto están establecidos, y FALSE cuando no hay ninguno establecido.

76.1.5. Traducción de mensajes

Las clases de validación proporcionan un método setTranslator() con el cual se puede especificar una instancia de Zend_Translate que traducirá los mensajes en caso de fallo de validación. El método getTranslator() devuelve la instancia de traductor establecida.

$validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
$translate = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array(
            Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''
        ),
        'locale' => 'en'
    )
);

$validator->setTranslator($translate);

Con el método estático setDefaultTranslator() se puede establecer una instancia de Zend_Translate que se utilizará para todas las clases de validación, y que se puede recuperar con getDefaultTranslator(). Esto evita tener que establecer manualmente un traductor para todas las clases de validador, y simplifica el código.

$translate = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array(
            Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''
        ),
        'locale' => 'en'
    )
);
Zend_Validate::setDefaultTranslator($translate);
[Note] Nota

Cuando se ha establecido una configuración regional (locale) de toda la aplicación dentro de su registro, entonces esa configuración regional se utilizará como traductor por defecto.

A veces es necesario deshabilitar el traductor dentro de un validador. Para lograr esto se puede usar el método setDisableTranslator(), que acepta un parámetro booleano, y translatorIsDisabled() para obtener el valor establecido.

$validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
if (!$validator->isTranslatorDisabled()) {
    $validator->setDisableTranslator();
}

También es posible usar un traductor en lugar de establecer mensajes propios con setMessage(). Pero al hacerlo, se debe tener en cuenta que el traductor también actúa sobre los mensajes que se establecen manualmente.