En Zend Framework 3 existen varios métodos para crear un validador:
new
).StaticValidator
.Luego, hablaremos de estos métodos con más detalles.
Un validador en general se puede usar no solo con formularios sino también para
validar datos arbitrarios. Para hacerlo simplemente creamos una instancia de la
clase validadora, configuramos el validador usando los métodos que provee y
llamando al método isValid()
del validador.
Por ejemplo, vamos a considerar el uso del validador EmailAddress
que revisa si
una dirección de correo electrónico cumple el estándar RFC-2822.
Un correo electrónico generalmente consiste en una parte local (nombre de usuario)
seguida por el carácter «arroba» (@), que es seguido por el nombre del servidor.
Por ejemplo, en la dirección de correo electrónico «name@example.com», «name» es
la parte local y «example.com» es el nombre del servidor.
El validador
EmailAddress
es útil para revisar la dirección de correo electrónico ingresada por el usuario en el formulario. El validador revisará la corrección de la parte local y el nombre del servidor, la presencia del carácter «arroba» (@) y opcionalmente se conectará con el servidor receptor y preguntará al servicio DNS por la existencia del registro MX (Registro de Intercambio de Correo) 30.
30) Un registro MX es un tipo de registro usado en el Sistema de Nombres de Dominio (DNS). El registro MX define uno o varios servidores de correo asignados al dominio receptor.
Los métodos provisto por el validador EmailAddress
se listan en la tabla 9.2:
Nombre del método | Descripción |
---|---|
__construct($options) |
Construye el validador. Acepta una lista de opciones que permiten configurarlo. |
isValid($value) |
Regresa true si el valor es una dirección de correo electrónico valido de acuerdo con RFC-2822, de lo contrario regresa false . |
getMessages() |
Si la validación falla, este método regresará un arreglo de mensajes de error. |
useDomainCheck($domain) |
Le dice al validador que revise la corrección de la parte del nombre de servidor. |
getDomainCheck() |
Regresa true si la revisión de la parte del nombre del servidor está activada. |
setHostnameValidator($hostnameValidator) |
Añade el validador que se usa para revisar la parte del nombre del servidor de la dirección de correo electrónico. |
getHostnameValidator() |
Regresa el validador usado para revisar la parte nombre del servidor de la dirección de correo electrónico. |
setAllow($allow) |
Asigna los tipos permitidos de nombres de servidor que se usan en una dirección de correo electrónico. |
getAllow() |
Regresa los tipos permitidos para el nombre de servidor. |
useMxCheck($mx) |
Señala si ejecutar la revisión de la validez del registro MX a través del servicio DNS. |
getMxCheck($mx) |
Regresa true si la revisión MX esta activada. |
useDeepMxCheck($deep) |
Obliga a usar la validación profunda del registro MX. |
getDeepMxCheck() |
Regresa true si la revisión MX profunda está activada, de lo contrario regresa falso . |
isMxSupported() |
Regresa true si la revisión MX mediante la función de PHP getmxrr() está soportada por el sistema, de lo contrario regresa false . |
getMXRecord() |
Luego de la validación, regresa la información encontrada del registro MX. |
Como podemos ver en la tabla de arriba, el validador EmailAddress
, además de los
métodos isValid()
y getMessages()
, provee el método constructor al que se puede
opcionalmente pasar la lista completa de opciones para inicializar el validador.
Todos los validadores estándares tienen un método constructor, que opcionalmente acepta un arreglo de opciones para configurar el validador cuando se instancia manualmente.
Además, la clase EmailAddress
provee un número de métodos que se pueden usar para
asignar opciones específicas al validador.
El método useDomainCheck()
dice si revisar o no el nombre del servidor.
Por defecto, esta revisión está habilitada. El método setAllow()
otorga la capacidad
de especificar que tipos de nombres de servidor se permiten. Podemos pasar una
combinación de constantes separadas por el operador OR. La mayoría de las constantes
poseen el prefijo ALLOW_
31 y son las siguientes:
ALLOW_DNS
permite nombres de dominio (este es el valor por defecto).IP_ADDRESS
permite direcciones IP.ALLOW_LOCAL
permite nombres de red locales.ALLOW_ALL
permite todas las anteriores.31) Las constantes con el prefijo ALLOW_
las provee el validador
Hostname
.
Internamente, el validador
EmailAddress
usa el validadorHostname
para revisar la parte del nombre del servidor de la dirección de correo electrónico. Opcionalmente, podemos añadir un validador personalizado para el nombre del servidor con el uso del métodosetHostnameValidator()
, sin embargo no es común hacerlo.
El método useMxCheck()
dice si el validador debe conectarse al servidor receptor
y consultar al servicio DNS el o los registros MX. Si el servidor no tiene
registros MX la validación falla. Además, podemos usar el método useDeepMxCheck()
para indicarle al validador que compare la dirección de correo electrónico
extraída del registro MX contra la lista negra con los nombres de dominios reservados
y ejecutar revisiones adicionales por cada dirección detectada.
No es recomendable ejecutar una revisión MX (o una revisión MX a fondo) porque este proceso puede tomar mucho tiempo e incrementar el tiempo de carga de la página web. Por defecto, estas revisiones están desactivadas.
Abajo, damos un código de ejemplo que muestra dos métodos equivalentes para crear
manualmente una instancia del validador EmailAddress
, colocando las opciones y
revisando los valores de entrada:
Ejemplo 1. Pasar las opciones al método constructor.
<?php
// Optionally, define a short alias for the validator class name.
use Zend\Validator\EmailAddress;
use Zend\Validator\Hostname;
// Create an instance of the validator, passing options to the constructor.
$validator = new EmailAddress([
'allow' => Hostname::ALLOW_DNS|Hostname::ALLOW_IP|Hostname::ALLOW_LOCAL,
'mxCheck' => true,
'deepMxCheck' => true
]);
// Validate an E-mail address.
$isValid = $validator->isValid('name@example.com'); // Returns true.
$isValid2 = $validator->isValid('abc'); // Returns false.
if(!$isValid2) {
// Get error messages in case of validation failure.
$errors = $validator->getMessages();
}
En el código de arriba creamos el objeto del validador EmailAddress
con la ayuda
del operador new
(líne 7). Pasamos un arreglo de opciones al constructor. Usamos
la llave allow
para permitir que la dirección de correo electrónico sea un nombre
de dominio, una dirección IP o una dirección de la red local. Además, activamos
mxCheck
y deepMxCheck
para, respectivamente, habilitar la revisión del registro
MX y ejecutar una revisión a fondo del registro MX.
En la línea 14, llamamos al método isValid()
y le pasamos el valor «name@example.com»
para su revisión. La salida esperada para esta llamada es el booleano true
.
En la línea 15, pasamos el valor «abc» al validador. Se espera que el proceso de
validación falle (se retorna false
). Luego, los mensajes de error se recuperan
con el método getMessages()
(línea 19).
Ejemplo 2. Sin pasar opciones a el constructor.
<?php
// Optionally, define a short alias for the validator class name.
use Zend\Validator\EmailAddress;
use Zend\Validator\Hostname;
// Create an instance of the validator.
$validator = new EmailAddress();
// Optionally, configure the validator
$validator->setAllow(
Hostname::ALLOW_DNS|Hostname::ALLOW_IP|Hostname::ALLOW_LOCAL);
$validator->useMxCheck(true);
$validator->useDeepMxCheck(true);
// Validate an E-mail address.
$isValid = $validator->isValid('name@example.com'); // Returns true.
$isValid2 = $validator->isValid('abc'); // Returns false.
if(!$isValid2) {
// Get error messages in case of validation failure.
$errors = $validator->getMessages();
}
En el código de arriba, creamos el objeto validador EmailAddress
con la ayuda
del operador new
(línea 7).
En las líneas 10-13, configuramos el validador. Llamamos al método setAllow()
para permitir que la dirección de correo electrónico sea un nombre de dominio,
una dirección IP o una dirección de red local. Además, usamos los métodos
useMxCheck()
y useDeepMxCheck()
para, respectivamente, habilitar la revisión
del registro MX y la revisión a profundidad del registro MX.
En la línea 16, llamamos al método isValid()
y le pasamos la cadena de caracteres
con el valor «name@example.com» para que sea revisada. La salida esperada de esta
llamada es el booleano true
.
En la línea 17, pasamos una cadena de caracteres con el valor «abc» al validador.
Se espera que el proceso de validación falle. Luego, los mensajes de error son
recuperados con el método getMessages()
(línea 21).
Una forma alternativa a la instanciación manual del validador es el uso de la clase
StaticValidator
. La clase StaticValidator
es un tipo de «procurador» (proxy)
diseñado para la instanciación, configuración y ejecución automática del validador.
Por ejemplo, vamos a considerar como crear el mismo validador EmailAddress
,
configurarlo y llamar a su método isValid()
:
<?php
// Create and execute the EmailAddress validator through StaticValidator proxy.
$validatedValue = \Zend\Validator\StaticValidator::execute('name@example.com',
'EmailAddress',
[
'allow' =>
Hostname::ALLOW_DNS|
Hostname::ALLOW_IP|
Hostname::ALLOW_LOCAL,
'mxCheck' => true,
'deepMxCheck' => true
]);
// The expected output is boolean true.
La clase StaticValidator
provee el método estático execute()
que toma tres
argumentos: el valor de entrada, el nombre del filtro a aplicar y el arreglo de
opciones especificas del filtro.
En la línea 3 llamamos al método execute()
para crear automática el validador
EmailAddress
, llamar a sus métodos setAllowDns()
, useMxCheck()
y useDeepMxCheck()
y pasar los valores de entrada a su método isValid()
. Esto es muy útil porque
todo esto puede ser hecho en una sola llamada.
La clase
StaticValidator
no provee la capacidad de extraer la lista de errores de validación en una forma que pueda ser legible por humanos. Sin embargo, como la claseStaticValidator
está diseñada para usarse fuera de los formularios y no tiene el propósito de mostrar los resultados a un humano, esto no parece ser una gran desventaja.
Cuando usamos validadores con reglas de validación de formularios, generalmente no construimos un objeto validador explícitamente como hicimos en la sección anterior, en su lugar pasamos un arreglo de configuración a la clase fábrica que automáticamente construye el validador y opcionalmente lo configura. Ya vimos como esto funciona cuando agregamos reglas de validación para el formulario de contacto en Colectar las Entradas del Usuario con Forms
Por ejemplo, vamos a mostrar como construir el mismo filtro EmailAddress
con
la ayuda de una fábrica:
<?php
// It is assumed that you call the following code inside of the form model's
// addInputFilter() method.
$inputFilter->add([
// ...
'validators' => [
[
'name' => 'EmailAddress',
'options' => [
'allow' => \Zend\Validator\Hostname::ALLOW_DNS,
'useMxCheck' => false,
'useDeepMxCheck' => false,
],
],
],
// ...
]);
En el código de arriba llamamos al método add()
provisto por la clase contenedor
InputFilter
(línea 5). El método add()
toma un arreglo que tiene la llave
validators
. Generalmente registramos los validadores dentro de esta llave (línea 7).
Los validadores registrados dentro de esta llave se insertan dentro de la cadena
validadora in el orden en que aparecen en la lista.
La configuración de un validador generalmente consiste en una llave name
(línea 9)
y otra options
(línea 10). La primera, name
, es el nombre completo de la clase
validadora (por ejemplo, \Zend\Validator\EmailAddress
) o su alias (EmailAddress
).
La llave options
es un arreglo que consiste en opciones especifica para cada validador.
Cuando la clase fábrica instancia el validador, ella pasa la lista de opciones
al constructor del validador y el constructor inicializa el validador según sea
necesario.