Validatorji vrednosti
Potrebujete hitro in enostavno preveriti, ali je v spremenljivki na primer veljaven e-poštni naslov? Za to vam bo prišel prav Nette\Utils\Validators, statični razred z uporabnimi funkcijami za validacijo vrednosti.
Namestitev:
composer require nette/utils
Vsi primeri predpostavljajo ustvarjen vzdevek:
use Nette\Utils\Validators;
Osnovna uporaba
Razred ponuja vrsto metod za preverjanje vrednosti, kot so isList(), isUnicode(), isEmail(), isUrl() itd., za uporabo v vaši kodi:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException;
}
Poleg tega lahko preveri, ali je vrednost t.i. pričakovani tipi, kar je niz, kjer so
posamezne možnosti ločene z navpičnico |
. Tako lahko enostavno preverimo več tipov z uporabo is():
if (!Validators::is($val, 'int|string|bool')) {
// ...
}
Vendar nam to daje tudi možnost ustvariti sistem, kjer je treba pričakovanja zapisati kot nize (na primer v anotacijah ali konfiguraciji) in nato glede na njih preverjati vrednosti.
Za pričakovane tipe lahko postavimo tudi zahtevo assert(), ki, če ni izpolnjena, sproži izjemo.
Pričakovani tipi
Pričakovani tipi tvorijo niz, sestavljen iz ene ali več različic, ločenih z navpičnico |
, podobno kot se
zapisujejo tipi v PHP (npr. 'int|string|bool')
. Sprejema se tudi nullable zapis ?int
.
Polje, kjer so vsi elementi določenega tipa, se zapiše v obliki int[]
.
Nekaterim tipom lahko sledi dvopičje in dolžina :length
ali obseg :[min]..[max]
, npr.
string:10
(niz dolžine 10 bajtov), float:10..
(število 10 in večje), array:..10
(polje
do desetih elementov) ali list:10..20
(seznam z 10 do 20 elementi), ali pa regularni izraz pri
pattern:[0-9]+
.
Pregled tipov in pravil:
PHP tipi | |
---|---|
array |
lahko navedete obseg za število elementov |
bool |
|
float |
lahko navedete obseg za vrednost |
int |
lahko navedete obseg za vrednost |
null |
|
object |
|
resource |
|
scalar |
int|float|bool|string |
string |
lahko navedete obseg za dolžino v bajtih |
callable |
|
iterable |
|
mixed |
|
psevdo-tipi | |
list |
indeksirano polje, lahko navedete obseg za število elementov |
none |
prazna vrednost: '' , null , false |
number |
int|float |
numeric |
število vključno z besedilno reprezentacijo |
numericint |
celo število vključno z besedilno reprezentacijo |
unicode |
UTF-8 niz, lahko navedete obseg za dolžino v znakih |
znakovni razred (ne sme biti prazen niz) | |
alnum |
vsi znaki so alfanumerični |
alpha |
vsi znaki so črke [A-Za-z] |
digit |
vsi znaki so števke |
lower |
vsi znaki so male črke [a-z] |
space |
vsi znaki so presledki |
upper |
vsi znaki so velike črke [A-Z] |
xdigit |
vsi znaki so šestnajstiške števke [0-9A-Fa-f] |
preverjanje sintakse | |
pattern |
regularni izraz, ki mu mora ustrezati cel niz |
email |
E-pošta |
identifier |
PHP identifikator |
url |
URL |
uri |
URI |
preverjanje okolja | |
class |
je obstoječ razred |
interface |
je obstoječ vmesnik |
directory |
je obstoječ imenik |
file |
je obstoječa datoteka |
Asercije
assert ($value, string $expected, string
$label='variable'
): void
Preverja, ali je vrednost eden od pričakovanih tipov, ločenih z navpičnico. Če ne,
sproži izjemo Nette\Utils\AssertionException. Besedo
variable
v besedilu izjeme lahko nadomestite z drugo s parametrom $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
Preverja, ali je element pod ključem $key
v polju $array
eden od pričakovanih tipov, ločenih z navpičnico. Če ne, sproži izjemo Nette\Utils\AssertionException. Niz
item '%' in array
v besedilu izjeme lahko nadomestite z drugim s parametrom $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.
Validatorji
is ($value, string $expected): bool
Preveri, ali je vrednost eden od pričakovanih tipov, ločenih z navpičnico.
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15'); // true, dolžina je 15 bajtov
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
isEmail (mixed $value): bool
Preveri, ali je vrednost veljaven e-poštni naslov. Ne preverja se, ali domena dejansko obstaja, preverja se samo sintaksa. Funkcija upošteva tudi prihodnje TLD, ki so lahko tudi v unicode.
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
isInRange (mixed $value, array $range): bool
Preveri, ali je vrednost v danem obsegu [min, max]
, kjer lahko zgornjo ali spodnjo mejo izpustimo
(null
). Lahko se primerjajo števila, nizi in objekti DateTime.
Če manjkata obe meji ([null, null]
) ali je vrednost null
, vrne 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
Preveri, ali je vrednost 0
, ''
, false
ali null
.
Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false
isNumeric (mixed $value): bool
Preveri, ali je vrednost število ali število, zapisano v nizu.
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
Preveri, ali je vrednost celo število ali celo število, zapisano v nizu.
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
Preveri, ali je vrednost sintaktično veljaven identifikator v PHP, na primer za imena razredov, metod, funkcij itd.
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType (string $type): bool
Ugotovi, ali je $type
vgrajen tip PHP. V nasprotnem primeru gre za ime razreda.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string $type): bool
Preveri, ali je dana deklaracija tipa sintaktično veljavna.
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
Ugotovi, ali je $type
eden od internih tipov self
, parent
, static
.
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode (mixed $value): bool
Preveri, ali je vrednost veljaven UTF-8 niz.
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false
isUrl (mixed $value): bool
Preveri, ali je vrednost veljaven URL naslov.
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
Preveri, ali je vrednost veljaven URI naslov, torej pravzaprav niz, ki se začne s sintaktično veljavno shemo.
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false