Validadores de valores

¿Necesitas verificar rápida y fácilmente que una variable contiene, por ejemplo, una dirección de correo electrónico válida? Entonces le resultará útil Nette\Utils\Validators, una clase estática con funciones útiles para validar valores.

Instalación:

composer require nette/utils

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

use Nette\Utils\Validators;

Uso básico

La clase Validators tiene un número de métodos para validar valores, como isList(), isUnicode(), isEmail(), isUrl(), etc. para usar en tu código:

if (!Validators::isEmail($email)) {
	throw new InvalidArgumentException;
}

Además, puede verificar si el valor satisface los llamados tipos esperados, que es una cadena donde las opciones individuales están separadas por una barra vertical |. Esto facilita la verificación de tipos de unión utilizando if():

if (!Validators::is($val, 'int|string|bool')) {
	// ...
}

Pero también te da la oportunidad de crear un sistema donde es necesario escribir las expectativas como cadenas (por ejemplo en anotaciones o configuración) y luego verificar de acuerdo a ellas.

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

Tipos esperados

Un tipo esperado es una cadena formada por una o más variantes separadas por una barra vertical |, similar to writing types in PHP (ie. 'int|string|bool'). También se permite la notación nulable ?int.

Una matriz en la que todos los elementos son de un tipo determinado se escribe de la forma int[].

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

Resumen de tipos y reglas:

Tipos PHP
array range for the number of items can be given
bool  
float rango para el valor puede ser dado
int rango para el valor puede ser dado
null  
object  
resource  
scalar int|float|bool|string
string se puede indicar la longitud en bytes
callable  
iterable  
mixed  
Pseudotipos
list array indexado, se puede dar un rango para el número de elementos
none valor vacío: '', null, false
number int|float
numeric número con representación textual
numericint número entero con representación textual
unicode Cadena UTF-8, se puede dar un rango para la longitud en caracteres
Clase 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 minúsculas. [a-z]
space todos los caracteres son espacios.
upper todos los caracteres son 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 coincidir toda la cadena
email Correo electrónico
identifier Identificador PHP
url URL
uri URI
Validación del entorno
class es una clase existente
interface es una interfaz existente
directory es un directorio existente
file es un archivo existente

Afirmación

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

Verifica que el valor es de los tipos esperados separados por una tubería. Si no es así, lanza la excepción Nette\Utils\AssertionException. La palabra variable del mensaje de excepción puede sustituirse por el parámetro $label.

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

assertField(array $array, string|int $key, string $expected=null, string $label=null)void

Verifica que el elemento $key en el array $array es de los tipos esperados separados por una tubería. Si no es así, lanza la excepción Nette\Utils\AssertionException. La cadena item '%' in array del mensaje de excepción puede sustituirse por 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 de los tipos esperados separados por una tubería.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15');     // true, length is 15 bytes
Validators::is('Nette Framework', 'string:8..');    // true
Validators::is('Nette Framework', 'string:30..40'); // false

isEmail(mixed $value): bool

Verifica que el valor es una dirección de correo electrónico válida. No verifica que el dominio exista realmente, sólo se verifica la sintaxis. La función también cuenta con 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 se puede omitir el límite superior o inferior (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
Validators::isInRange(1, [5]);        // false

isNone(mixed $value): bool

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

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 escrito en una 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

isNumericInt(mixed $value)bool

Comprueba si el valor es un número entero o un número entero escrito en una 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 clases, métodos, funciones, 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 incorporado en PHP. De lo contrario, es el nombre de la clase.

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

isTypeDeclaration(string $type)bool

Comprueba si la declaración de tipo es sintácticamente correcta.

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 $type)bool

Determine si $type es uno de los tipos internos self, parent, 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

isUrl(mixed $value): bool

Comprueba si el valor es una dirección URL válida.

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
Validators::isUrl('nette.org');                   // false

isUri(string $value): bool

Comprueba que el valor es una dirección URI válida, es decir, realmente una cadena que comienza con un esquema sintácticamente válido.

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false