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? Para eso te será útil Nette\Utils\Validators, una clase estática con funciones útiles para la validación de valores.

Instalación:

composer require nette/utils

Todos los ejemplos asumen que se ha creado un alias:

use Nette\Utils\Validators;

Uso básico

La clase dispone de una serie de métodos para comprobar valores, como isUnicode(), isEmail(), isUrl(), etc., que puedes usar en tu código:

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

Además, puede verificar si un valor pertenece a los llamados tipos esperados, que es una cadena donde las diferentes opciones se separan con una barra vertical |. Así podemos verificar fácilmente múltiples tipos usando is():

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

Esto también nos da la opción de crear un sistema donde las expectativas se escriben como cadenas (por ejemplo, en anotaciones o configuración) y luego se usan para validar los valores.

También se puede aplicar una aserción a los tipos esperados usando assert(), que lanza una excepción si no se cumple.

Tipos esperados

Los tipos esperados forman una cadena que consta de una o más variantes separadas por una barra vertical |, de forma similar a como se escriben los tipos en PHP (p. ej., 'int|string|bool'). También se acepta la notación nullable ?int.

Un array donde todos los elementos son de un tipo determinado 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 (cadena de 10 bytes de longitud), float:10.. (número 10 o mayor), array:..10 (array con hasta diez elementos), list:10..20 (lista con 10 a 20 elementos), o una expresión regular con pattern:'[0-9]+'.

Resumen de tipos y reglas:

Tipos PHP
array se puede especificar un rango para el número de elementos
bool  
float se puede especificar un rango para el valor
int se puede especificar un rango para el valor
null  
object  
resource  
scalar int|float|bool|string
string se puede especificar un rango para la longitud en bytes
callable  
iterable  
mixed  
pseudo-tipos
list array indexado, se puede especificar un rango para el número de elementos
none valor vacío: '', null, false
number int|float
numeric número incluyendo representación textual
numericint entero incluyendo representación textual
unicode cadena UTF-8, se puede especificar un rango para la longitud en caracteres
clase de caracteres (no debe 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
upper todos los caracteres son letras mayúsculas [A-Z]
xdigit todos los caracteres son dígitos hexadecimales [0-9A-Fa-f]
verificación de sintaxis
pattern expresión regular que debe coincidir con la cadena completa
email Correo electrónico
identifier Identificador PHP
url URL
uri URI
verificación del entorno
class es una clase existente
interface es una interfaz existente
directory es un directorio existente
file es un archivo existente

Aserciones

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

Verifica que el valor pertenezca a uno de los tipos esperados separados por barra vertical. Si no es así, lanza una excepción Nette\Utils\AssertionException. La palabra variable en el texto de la excepción se puede reemplazar por otra mediante 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 si el elemento con la clave $key en el array $array pertenece a uno de los tipos esperados separados por barra vertical. Si no es así, lanza una excepción Nette\Utils\AssertionException. La cadena item '%' in array en el texto de la excepción se puede reemplazar por otra 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

Verifica si el valor pertenece a uno de los tipos esperados separados por barra vertical.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false
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

isEmail (mixed $value): bool

Verifica si el valor es una dirección de correo electrónico válida. No comprueba si el dominio existe realmente, solo verifica la sintaxis. La función también tiene en cuenta 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

Verifica si el valor está dentro del rango dado [min, max], donde el límite superior o inferior puede omitirse (estableciéndolo a null). Se pueden comparar números, cadenas y objetos DateTime.

Si faltan ambos límites ([null, null]) o si 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

Verifica 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

Verifica si el valor es un número o un número representado como 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

Verifica si el valor es un número entero o un entero representado como 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

Verifica 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

Comprueba si $type es un tipo incorporado (builtin) de PHP. En caso contrario, se asume que es un nombre de clase.

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

isTypeDeclaration (string $type)bool

Comprueba si la declaración de tipo dada es sintácticamente válida.

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

Comprueba si $type es una de las palabras clave internas self, parent, static.

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

isUnicode (mixed $value)bool

Verifica 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

Verifica 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

Verifica si el valor es una URI válida, es decir, 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
versión: 4.0