Tabla de contenidos
- 76.1. Introducción
- 76.2. Clases de validación estándar
- 76.2.1. Alnum
- 76.2.2. Alpha
- 76.2.3. Barcode
- 76.2.4. Between
- 76.2.5. Callback
- 76.2.6. CreditCard
- 76.2.7. Ccnum
- 76.2.8. Date
- 76.2.9. Db_RecordExists y Db_NoRecordExists
- 76.2.10. Digits
- 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.13. GreaterThan
- 76.2.14. Hex
- 76.2.15. Hostname
- 76.2.16. Iban
- 76.2.17. Identical
- 76.2.18. InArray
- 76.2.19. Int
- 76.2.20. Ip
- 76.2.21. Isbn
- 76.2.22. LessThan
- 76.2.23. NotEmpty
- 76.2.24. PostCode
- 76.2.25. Regex
- 76.2.26. Validadores de 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
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.
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.
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.
![]() |
Nota |
|---|---|
Los métodos |
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";
}
}
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";
}
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.
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(): DevuelveTRUEcuando uno o más espacios de nombres por defecto están establecidos, yFALSEcuando no hay ninguno establecido.
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);
![]() |
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.
![[Note]](images/note.png)