Validatori di valori

Avete bisogno di verificare in modo rapido e semplice che una variabile contenga, per esempio, un indirizzo e-mail valido? Allora vi tornerà utile Nette\Utils\Validators, una classe statica con utili funzioni per validare i valori.

Installazione:

composer require nette/utils

Tutti gli esempi presuppongono che sia definito questo alias di classe:

use Nette\Utils\Validators;

Uso di base

La classe Validators offre numerosi metodi per controllare i valori, come isUnicode(), isEmail(), isUrl() e così via, da usare nel vostro codice:

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

Può inoltre verificare se il valore soddisfa i cosiddetti tipi attesi, cioè una stringa in cui le singole possibilità sono separate da una barra verticale |. Questo rende semplice verificare i tipi unione con is():

if (!Validators::is($val, 'int|string|bool')) {
	// gestione del tipo non valido...
}

Permette anche di creare sistemi in cui le aspettative vanno scritte come stringhe (per esempio nelle annotazioni o nelle configurazioni) e i valori vanno poi validati rispetto a esse.

Potete anche dichiarare un'asserzione, che solleva un'eccezione se l'aspettativa non viene soddisfatta.

Tipi attesi

I tipi attesi formano una stringa composta da una o più varianti separate da una barra |, come si scrivono i tipi in PHP (per esempio 'int|string|bool'). È accettata anche la notazione nullable ?int.

Un array in cui tutti gli elementi sono di un certo tipo si scrive nella forma int[].

Alcuni tipi possono essere seguiti da due punti e da una lunghezza :length o da un intervallo :[min]..[max], per esempio string:10 (una stringa lunga 10 byte), float:10.. (un numero maggiore o uguale a 10), array:..10 (un array con al massimo dieci elementi) o list:10..20 (un elenco con da 10 a 20 elementi), oppure da un'espressione regolare come pattern:[0-9]+.

Panoramica dei tipi e delle regole:

Tipi di PHP
array si può indicare un intervallo per il numero di elementi
bool  
boolean alias di bool
float si può indicare un intervallo per il valore
int si può indicare un intervallo per il valore
integer alias di int
null  
object  
resource  
scalar `int float bool string`
string si può indicare un intervallo per la lunghezza in byte      
callable        
iterable        
mixed        
Pseudo-tipi      
list array indicizzato, si può indicare un intervallo per il numero di elementi      
none valore vuoto: '', null, false, 0, 0.0[]      
number `int float`    
numeric numero, anche in forma di stringa      
numericint intero, anche in forma di stringa      
unicode stringa UTF-8, si può indicare un intervallo per la lunghezza in caratteri      
Classe di caratteri (non deve essere una stringa vuota)      
alnum tutti i caratteri sono alfanumerici      
alpha tutti i caratteri sono lettere [A-Za-z]      
digit tutti i caratteri sono cifre      
lower tutti i caratteri sono lettere minuscole [a-z]      
space tutti i caratteri sono spazi bianchi      
upper tutti i caratteri sono lettere maiuscole [A-Z]      
xdigit tutti i caratteri sono cifre esadecimali [0-9A-Fa-f]      
Validazione della sintassi      
pattern un'espressione regolare a cui deve corrispondere l'intera stringa      
email E-mail      
identifier identificatore PHP      
url URL      
uri URI      
Validazione dell'ambiente      
class è il nome di una classe esistente      
interface è il nome di un'interfaccia esistente      
directory è il percorso di una directory esistente      
file è il percorso di un file esistente      

Asserzione

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

Verifica che il valore sia uno dei tipi attesi separati da una barra. In caso contrario solleva Nette\Utils\AssertionException. La parola variable nel messaggio dell'eccezione si può sostituire con il parametro $label.

Validators::assert('Nette', 'string:5'); // OK (la stringa 'Nette' ha 5 byte)
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

Verifica che l'elemento con chiave $key nell'array $array sia uno dei tipi attesi separati da una barra. In caso contrario solleva Nette\Utils\AssertionException. La stringa item '%' in array nel messaggio dell'eccezione si può sostituire con il parametro $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.

Validatori

is ($value, string $expected)bool

Controlla se il valore è uno dei tipi attesi separati da una barra.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false (23 è fuori dall'intervallo 0-10)
Validators::is('Nette Framework', 'string:15');     // true, la lunghezza è di 15 byte
Validators::is('Nette Framework', 'string:8..');    // true
Validators::is('Nette Framework', 'string:30..40'); // false

everyIs (iterable $values, string $expected)bool

Controlla se ogni valore dell'iterabile è uno dei tipi attesi separati da una barra. Funziona come is() applicato a ogni elemento.

$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string');     // false (2020 non è una stringa)
Validators::everyIs($list, 'string|int'); // true

isEmail (string $value): bool

Verifica che il valore sia un indirizzo e-mail valido. Non verifica che il dominio esista davvero, controlla solo la sintassi. La funzione tiene conto anche dei futuri TLD, che possono essere anche in unicode.

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

isInRange (mixed $value, array $range)bool

Controlla se il valore rientra nell'intervallo indicato [min, max], dove il limite superiore o inferiore si può omettere (null). Si possono confrontare numeri, stringhe e oggetti DateTime.

Se mancano entrambi i limiti ([null, null]) oppure il valore è null, restituisce 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

Controlla se il valore è 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

Controlla se il valore è un numero oppure un numero rappresentato come stringa.

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 (la notazione scientifica non è accettata)

isNumericInt (mixed $value)bool

Controlla se il valore è un intero oppure un intero rappresentato come stringa.

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

Controlla se il valore è un identificatore sintatticamente valido in PHP (per esempio per i nomi di classi, metodi, funzioni ecc.).

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

isBuiltinType (string $type)bool

Stabilisce se $type è un tipo integrato di PHP (per esempio string, int, array, bool). In caso contrario si presume che sia il nome di una classe.

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

isTypeDeclaration (string $type)bool

Controlla se la stringa di dichiarazione di tipo indicata è sintatticamente valida secondo le regole di PHP (compresi i tipi unione, intersezione e 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

Stabilisce se $name è una delle parole chiave di tipo interne self, parent o static.

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

isUnicode (mixed $value)bool

Controlla se il valore è una stringa UTF-8 valida.

Validators::isUnicode('nette'); // true
Validators::isUnicode('');      // true
Validators::isUnicode("\xA0");  // false (sequenza UTF-8 non valida)

isUrl (string $value): bool

Controlla se il valore è un indirizzo URL assoluto valido secondo 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 (questa funzione non valida la parte userinfo)
Validators::isUrl('nette.org');                   // false (manca lo schema)

isUri (string $value): bool

Verifica che il valore sia un indirizzo URI valido, cioè una stringa che inizia con uno schema sintatticamente valido seguito dai due punti (per esempio http:, https:, mailto:, ftp:).

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false (manca lo schema)
versione: 4.x