A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

9.4. Instanciar un validador

En Zend Framework 3 existen varios métodos para crear un validador:

Luego, hablaremos de estos métodos con más detalles.

9.4.1. Método 1. Instanciación Manual del Validador

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:

Tabla 9.2. Métodos públicos del validador EmailAddress
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:

31) Las constantes con el prefijo ALLOW_ las provee el validador Hostname.

Internamente, el validador EmailAddress usa el validador Hostname 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étodo setHostnameValidator(), 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).

9.4.2. Método 2. Usar la envoltura StaticValidator

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 clase StaticValidator 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.

9.4.3. Método 3. Usar un arreglo de configuración

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.


Top