You are browsing the unmaintained documentation for old Nette 2.3. See documentation for current Nette.

Validátory hodnot

Potřebujete rychle a jednoduše ověřit, že v proměnné je například platná emailová adresa? To se vám bude hodit Nette\Utils\Validators, statická třída s užitečnými funkcemi pro validaci hodnot.

Instalace:

composer require nette/utils

Všechny příklady předpokládají vytvořený alias:

use Nette\Utils\Validators;

Základní použití

Třída disponuje řadou metod pro kontrolu hodnot, jako třeba isList(), isUnicode(), isEmail(), isUrl() atd. pro využití ve vašem kódu:

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

Dále umí oveřit, zda hodnota je tzv. očekávaný typy, což je řetězec, kde se jednotlivé možnosti oddělují svislítkem |. Můžeme tak snadno oveřit více typů pomocí if():

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

Ale také nám to dává možnost vytvořit si systém, kde je potřeba očekávání zapisovat jako řetězce (například v anotacích nebo konfiguraci) a pak podle nich ověřovat hodnoty.

Na očekávané typy lze dát i požadavek assert(), který když není splněn, tak se vyhodí výjimka.

Očekávané typy

Očekávané typy tvoří řetězec skládající se z jedné čí více variant oddělených svislítkem |, podobně jako se zapisují typy v PHP (např. 'int|string|bool').

Za některými typy může následovat dvojtečka a délka :length nebo rozsah :[min]..[max], např. string:10 (řetězec o délce 10 bytů), float:10.. (číslo 10 a větší), array:..10 (pole do deseti prvků) nebo list:10..20 (list s 10 až 20 prvky), případně regulární výraz u pattern:[0-9]+.

Přehled typů a pravidel:

PHP typy
array lze uvést rozsah pro počet prvků
bool  
float lze uvést rozsah pro hodnotu
int lze uvést rozsah pro hodnotu
NULL  
object  
resource  
scalar int|float|bool|string
string lze uvést rozsah pro délku v bajtech
callable  
pseudo-typy
list indexované pole, lze uvést rozsah pro počet prvků
none prázdná hodnota: '', nullfalse
number int|float
numeric číslo včetně textové reprezentace
numericint celé číslo včetně textové reprezentace
unicode UTF-8 řetězec, lze uvést rozsah pro délku ve znacích
znaková třída (nesmí být prázdný řetězec)
alnum všechny znaky jsou alfanumerické
alpha všechny znaky jsou písmena [A-Za-z]
digit všechny znaky jsou číslice
lower všechny znaky jsou malá písmena [a-z]
space všechny znaky jsou mezery
upper všechny znaky jsou velká písmena [A-Z]
xdigit všechny znaky jsou hexadecimální číslice [0-9A-Fa-f]
ověření syntaxe
pattern regulární výraz, kterému musí odpovídat celý řetězec
email E-mail
identifier PHP identifikátor
url URL
uri URI

Asserce

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

Ověřuje, že hodnota je jedním z očekávaných typů oddělených svislítkem. Pokud ne, vyhodí výjimku Nette\Utils\AssertionException. Slovo variable v textu výjimky lze nahradit za jiné parametrem $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

Ověřuje, zda prvek pod klíčem $key v poli $array je jedním z očekávaných typů oddělených svislítkem. Pokud ne, vyhodí výjimku Nette\Utils\AssertionException. Řetězec item '%' in array v textu výjimky lze nahradit za jiný parametrem $label.

$arr = array('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.

Validátory

is($value, string $expected)bool

Ověří, zda hodnota je jedním z očekávaných typů oddělených svislítkem.

Validators::is(1, 'int|float');  // TRUE
Validators::is(23, 'int:0..10'); // FALSE
Validators::is('Nette Framework', 'string:15');     // TRUE, délka je 15 bytů
Validators::is('Nette Framework', 'string:8..');    // TRUE
Validators::is('Nette Framework', 'string:30..40'); // FALSE

isEmail(mixed $value): bool

Ověří, zda je hodnota platná e-mailová adresa. Neověřuje se, zda doména skutečně existuje, ověřuje se pouze syntaxe. Funkce počítá i s budoucími TLD, které mohou být i v unicode.

Validators::isEmail('example@nette.org'); // TRUE
Validators::isEmail('example@localhost'); // FALSE
Validators::isEmail('nette');             // FALSE

isInRange(mixed $value, array $range)bool

Ověří, zda je hodnota v daném rozsahu [min, max], kde horní nebo spodní hranici můžeme vynechat (NULL).

Validators::isInRange(5, array(0, 5));     // TRUE
Validators::isInRange(23, array(NULL, 5)); // FALSE
Validators::isInRange(23, array(5));       // TRUE
Validators::isInRange(1, array(5));        // FALSE

isList(mixed $value): bool

Ověří, zda je hodnota indexované pole.

Validators::isList(array('a', 'b'));   // TRUE
Validators::isList(array('key' => 'a')); // FALSE
Validators::isList(array(1 => 'a', 0 => 'b')); // FALSE

isNone(mixed $value): bool

Ověří, zda je hodnota 0, '', false or null.

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

isNumeric(mixed $value): bool

Ověří, zda je hodnota číslo nebo číslo zapsané v řetězci.

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

Ověří, zda je hodnota celé číslo nebo číslo zapsané v řetězci.

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

Ověří, zda je hodnota syntakticky platný identifikátor v PHP, například pro názvy tříd, metod, funkcí apod.

Validators::isPhpIdentifier('');        // FALSE
Validators::isPhpIdentifier('Hello1');  // TRUE
Validators::isPhpIdentifier('1Hello');  // FALSE
Validators::isPhpIdentifier('one two'); // FALSE

isUnicode(mixed $value): bool

Ověří, zda je hodnota platný UTF-8 string.

Validators::isUnicode('nette'); // TRUE
Validators::isUnicode('');      // TRUE
Validators::isUnicode("\xA0");  // FALSE

isUrl(mixed $value): bool

Ověří, zda je hodnota platná URL adresa.

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

Ověří, zda je hodnota platná URI adresa, tedy vlastně řetězec začínající platným schématem.

Validators::isUri('https://nette.org');           // TRUE
Validators::isUri('mailto:gandalf@example.org');  // TRUE
Validators::isUrl('nette.org');                   // FALSE