Validadores de valores

¿Necesita comprobar rápida y fácilmente que una variable contiene, por ejemplo, una dirección de correo válida? Entonces le vendrá bien Nette\Utils\Validators, una clase estática con funciones útiles para validar valores.

Instalación:

composer require nette/utils

Todos los ejemplos suponen que está definido el siguiente alias de clase:

use Nette\Utils\Validators;

Uso básico

La clase Validators ofrece numerosos métodos para comprobar valores, como isUnicode(), isEmail(), isUrl(), etc., para usarlos en su código:

if (!Validators::isEmail($email)) {
	throw new InvalidArgumentException('Invalid email address provided.');
}

Puede además comprobar si el valor cumple los llamados Tipos esperados, que son una cadena donde las distintas opciones se separan con una barra vertical |. Así resulta fácil verificar tipos union con is():

if (!Validators::is($val, 'int|string|bool')) {
	// Trata el tipo no válido...
}

Esto le permite también crear sistemas donde las expectativas deben escribirse como cadenas (por ejemplo, en anotaciones o configuraciones) y validar después los valores contra ellas.

También puede declarar una aserción, que lanza una excepción si la expectativa no se cumple.

Tipos esperados

Los tipos esperados forman una cadena compuesta por una o varias variantes separadas por una barra |, de forma parecida a como se escriben los tipos en PHP (por ejemplo, 'int|string|bool'). También se admite la notación nullable ?int.

Un array cuyos elementos son todos de cierto tipo se escribe en la forma int[].

Algunos tipos pueden ir seguidos de dos puntos y una longitud :length o un rango :[min]..[max], por ejemplo string:10 (una cadena de 10 bytes de longitud), float:10.. (un número igual o mayor que 10), array:..10 (un array de hasta diez elementos) o list:10..20 (una lista de 10 a 20 elementos), o bien una expresión regular como pattern:[0-9]+.

Resumen de los tipos y las reglas:

Tipos de PHP
array se puede indicar un rango para el número de elementos
bool  
boolean alias de bool
float se puede indicar un rango para el valor
int se puede indicar un rango para el valor
integer alias de int
null  
object  
resource  
scalar `int float bool string`
string se puede indicar un rango para la longitud en bytes      
callable        
iterable        
mixed        
Pseudotipos      
list array indexado, se puede indicar un rango para el número de elementos      
none valor vacío: '', null, false, 0, 0.0[]      
number `int float`    
numeric número, incluida su representación textual      
numericint entero, incluida su representación textual      
unicode cadena UTF-8, se puede indicar un rango para la longitud en caracteres      
Clases de caracteres (no puede ser una cadena vacía)      
alnum todos los caracteres son alfanuméricos      
alpha todos los caracteres son letras [A-Za-z]      
digit todos los caracteres son dígitos      
lower todos los caracteres son letras minúsculas [a-z]      
space todos los caracteres son espacios en blanco      
upper todos los caracteres son letras mayúsculas [A-Z]      
xdigit todos los caracteres son dígitos hexadecimales [0-9A-Fa-f]      
Validación de sintaxis      
pattern una expresión regular con la que debe encajar toda la cadena      
email correo electrónico      
identifier identificador de PHP      
url URL      
uri URI      
Validación del entorno      
class es el nombre de una clase existente      
interface es el nombre de una interfaz existente      
directory es la ruta de un directorio existente      
file es la ruta de un archivo existente      

Aserción

assert ($value, string $expected, string $label='variable')void

Comprueba que el valor sea uno de los Tipos esperados separados por una barra. Si no lo es, lanza Nette\Utils\AssertionException. La palabra variable del mensaje de la excepción se puede sustituir mediante el parámetro $label.

Validators::assert('Nette', 'string:5'); // OK (la cadena 'Nette' tiene 5 bytes)
Validators::assert('Lorem ipsum dolor sit', 'string:78');
// AssertionException: The variable expects to be string in range 78, string 'Lorem ipsum dolor sit' given.

assertField (array $array, string|int $key, ?string $expected=null, string $label="item '%' in array")void

Comprueba que el elemento de clave $key del array $array sea uno de los Tipos esperados separados por una barra. Si no lo es, lanza Nette\Utils\AssertionException. La cadena item '%' in array del mensaje de la excepción se puede sustituir mediante el parámetro $label.

$arr = ['foo' => 'Nette'];

Validators::assertField($arr, 'foo', 'string:5'); // OK
Validators::assertField($arr, 'bar', 'string:15');
// AssertionException: Missing item 'bar' in array.
Validators::assertField($arr, 'foo', 'int');
// AssertionException: The item 'foo' in array expects to be int, string 'Nette' given.

Validadores

is ($value, string $expected)bool

Comprueba si el valor es uno de los Tipos esperados separados por una barra.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false (23 está fuera del rango 0-10)
Validators::is('Nette Framework', 'string:15');     // true, la longitud es de 15 bytes
Validators::is('Nette Framework', 'string:8..');    // true
Validators::is('Nette Framework', 'string:30..40'); // false

everyIs (iterable $values, string $expected)bool

Comprueba si todos los valores del iterable son uno de los Tipos esperados separados por una barra. Funciona como is() aplicado a cada elemento.

$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string');     // false (2020 no es una cadena)
Validators::everyIs($list, 'string|int'); // true

isEmail (string $value): bool

Comprueba que el valor sea una dirección de correo electrónico válida. No verifica que el dominio exista realmente, solo la sintaxis. La función tiene además en cuenta los futuros TLD, que también pueden estar en unicode.

Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette');             // false

isInRange (mixed $value, array $range)bool

Comprueba si el valor está dentro del rango dado [min, max], donde el límite superior o el inferior se pueden omitir (null). Se pueden comparar números, cadenas y objetos DateTime.

Si faltan ambos límites ([null, null]) o el valor es null, devuelve false.

Validators::isInRange(5, [0, 5]);     // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]);       // true (equivale a [5, null])
Validators::isInRange(1, [5]);        // false

isNone (mixed $value): bool

Comprueba si el valor es 0, '', false, null, 0.0 o [].

Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false

isNumeric (mixed $value)bool

Comprueba si el valor es un número o un número representado como cadena.

Validators::isNumeric(23);      // true
Validators::isNumeric(1.78);    // true
Validators::isNumeric('+42');   // true
Validators::isNumeric('3.14');  // true
Validators::isNumeric('nette'); // false
Validators::isNumeric('1e6');   // false (no se acepta la notación científica)

isNumericInt (mixed $value)bool

Comprueba si el valor es un entero o un entero representado como cadena.

Validators::isNumericInt(23);      // true
Validators::isNumericInt(1.78);    // false
Validators::isNumericInt('+42');   // true
Validators::isNumericInt('3.14');  // false
Validators::isNumericInt('nette'); // false

isPhpIdentifier (string $value)bool

Comprueba si el valor es un identificador sintácticamente válido en PHP (por ejemplo, para nombres de clase, de método, de función, etc.).

Validators::isPhpIdentifier('');        // false
Validators::isPhpIdentifier('Hello1');  // true
Validators::isPhpIdentifier('1Hello');  // false
Validators::isPhpIdentifier('one two'); // false

isBuiltinType (string $type)bool

Determina si $type es un tipo nativo de PHP (por ejemplo, string, int, array, bool). En caso contrario, se considera un nombre de clase.

Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo');    // false

isTypeDeclaration (string $type)bool

Comprueba si la cadena de declaración de tipo dada es sintácticamente válida según las reglas de declaración de tipos de PHP (incluidos los tipos union, intersection y DNF).

Validators::isTypeDeclaration('?string');      // true
Validators::isTypeDeclaration('string|null');  // true
Validators::isTypeDeclaration('Foo&Bar');      // true
Validators::isTypeDeclaration('(A&C)|null');   // true

Validators::isTypeDeclaration('?string|null'); // false
Validators::isTypeDeclaration('|foo');         // false
Validators::isTypeDeclaration('(A|B)');        // false

isClassKeyword (string $name)bool

Determina si $name es una de las palabras clave internas de tipo self, parent o static.

Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo');  // false

isUnicode (mixed $value)bool

Comprueba si el valor es una cadena UTF-8 válida.

Validators::isUnicode('nette'); // true
Validators::isUnicode('');      // true
Validators::isUnicode("\xA0");  // false (secuencia UTF-8 no válida)

isUrl (string $value): bool

Comprueba si el valor es una dirección URL absoluta válida según la RFC 3986.

Validators::isUrl('https://nette.org:8080/path?query#fragment'); // true
Validators::isUrl('http://localhost');            // true
Validators::isUrl('http://192.168.1.1');          // true
Validators::isUrl('http://[::1]');                // true
Validators::isUrl('http://user:pass@nette.org');  // false (esta función no valida la parte userinfo)
Validators::isUrl('nette.org');                   // false (falta el esquema)

isUri (string $value): bool

Comprueba que el valor sea una dirección URI válida, es decir, una cadena que empieza por un esquema sintácticamente válido seguido de dos puntos (por ejemplo, http:, https:, mailto:, ftp:).

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false (falta el esquema)
versión: 4.x