Walidatory wartości
Potrzebujesz szybko i łatwo sprawdzić, czy zmienna zawiera na przykład prawidłowy adres e-mail? Przyda Ci się Nette\Utils\Validators, statyczna klasa z przydatnymi funkcjami do walidacji wartości.
Instalacja:
composer require nette/utils
Wszystkie przykłady zakładają utworzenie aliasu:
use Nette\Utils\Validators;
Podstawowe użycie
Klasa dysponuje szeregiem metod do kontroli wartości, takich jak #isList(), #isUnicode(), #isEmail(), #isUrl() itp., do wykorzystania w Twoim kodzie:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException;
}
Ponadto potrafi zweryfikować, czy wartość jest tzw. oczekiwanym typem, czyli ciągiem
znaków, gdzie poszczególne opcje oddziela się pionową kreską |
. Możemy więc łatwo zweryfikować wiele typów
za pomocą #if():
if (!Validators::is($val, 'int|string|bool')) {
// ...
}
Ale daje nam to również możliwość stworzenia systemu, w którym oczekiwania muszą być zapisywane jako ciągi znaków (na przykład w adnotacjach lub konfiguracji), a następnie według nich weryfikować wartości.
Na oczekiwane typy można również nałożyć wymaganie #assert(), które, jeśli nie zostanie spełnione, zgłosi wyjątek.
Oczekiwane typy
Oczekiwane typy tworzą ciąg znaków składający się z jednej lub więcej wariantów oddzielonych pionową kreską
|
, podobnie jak zapisuje się typy w PHP (np. 'int|string|bool'
). Akceptowany jest również zapis
nullable ?int
.
Tablica, w której wszystkie elementy są określonego typu, zapisuje się w postaci int[]
.
Za niektórymi typami może następować dwukropek i długość :length
lub zakres :[min]..[max]
,
np. string:10
(ciąg o długości 10 bajtów), float:10..
(liczba 10 i większa),
array:..10
(tablica do dziesięciu elementów) lub list:10..20
(lista z 10 do 20 elementami),
ewentualnie wyrażenie regularne przy pattern:[0-9]+
.
Przegląd typów i reguł:
Typy PHP | |
---|---|
array |
można podać zakres liczby elementów |
bool |
|
float |
można podać zakres wartości |
int |
można podać zakres wartości |
null |
|
object |
|
resource |
|
scalar |
int|float|bool|string |
string |
można podać zakres długości w bajtach |
callable |
|
iterable |
|
mixed |
|
pseudo-typy | |
list |
tablica indeksowana, można podać zakres liczby elementów |
none |
pusta wartość: '' , null , false |
number |
int|float |
numeric |
liczba wraz z reprezentacją tekstową |
numericint |
liczba całkowita wraz z reprezentacją tekstową |
unicode |
ciąg UTF-8, można podać zakres długości w znakach |
klasa znaków (nie może być pustym ciągiem) | |
alnum |
wszystkie znaki są alfanumeryczne |
alpha |
wszystkie znaki są literami [A-Za-z] |
digit |
wszystkie znaki są cyframi |
lower |
wszystkie znaki są małymi literami [a-z] |
space |
wszystkie znaki są spacjami |
upper |
wszystkie znaki są wielkimi literami [A-Z] |
xdigit |
wszystkie znaki są cyframi szesnastkowymi [0-9A-Fa-f] |
weryfikacja składni | |
pattern |
wyrażenie regularne, któremu musi odpowiadać cały ciąg |
email |
|
identifier |
Identyfikator PHP |
url |
URL |
uri |
URI |
weryfikacja środowiska | |
class |
jest istniejącą klasą |
interface |
jest istniejącym interfejsem |
directory |
jest istniejącym katalogiem |
file |
jest istniejącym plikiem |
Asercje
assert ($value, string $expected, string
$label='variable'
): void
Sprawdza, czy wartość jest jednym z oczekiwanych typów oddzielonych pionową kreską.
Jeśli nie, zgłasza wyjątek Nette\Utils\AssertionException. Słowo
variable
w tekście wyjątku można zastąpić innym za pomocą parametru $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
Sprawdza, czy element pod kluczem $key
w tablicy $array
jest jednym z oczekiwanych typów oddzielonych pionową kreską. Jeśli nie, zgłasza wyjątek Nette\Utils\AssertionException. Ciąg
item '%' in array
w tekście wyjątku można zastąpić innym za pomocą parametru $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.
Walidatory
is ($value, string $expected): bool
Sprawdza, czy wartość jest jednym z oczekiwanych typów oddzielonych pionową kreską.
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15'); // true, długość to 15 bajtów
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
isEmail (mixed $value): bool
Sprawdza, czy wartość jest prawidłowym adresem e-mail. Nie sprawdza, czy domena faktycznie istnieje, weryfikowana jest tylko składnia. Funkcja uwzględnia również przyszłe TLD, które mogą być również w unicode.
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
isInRange (mixed $value, array $range): bool
Sprawdza, czy wartość znajduje się w danym zakresie [min, max]
, gdzie górną lub dolną granicę można
pominąć (null
). Można porównywać liczby, ciągi znaków i obiekty DateTime.
Jeśli brakuje obu granic ([null, null]
) lub wartość jest null
, zwraca 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
Sprawdza, czy wartość to 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
Sprawdza, czy wartość jest liczbą lub liczbą zapisaną w ciągu znaków.
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
Sprawdza, czy wartość jest liczbą całkowitą lub liczbą całkowitą zapisaną w ciągu znaków.
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
Sprawdza, czy wartość jest składniowo poprawnym identyfikatorem w PHP, na przykład dla nazw klas, metod, funkcji itp.
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
isBuiltinType (string $type): bool
Sprawdza, czy $type
jest wbudowanym typem PHP. W przeciwnym razie jest to nazwa klasy.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string $type): bool
Sprawdza, czy podana deklaracja typu jest składniowo poprawna.
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
Sprawdza, czy $type
jest jednym z wewnętrznych typów self
, parent
,
static
.
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
isUnicode (mixed $value): bool
Sprawdza, czy wartość jest prawidłowym ciągiem UTF-8.
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false
isUrl (mixed $value): bool
Sprawdza, czy wartość jest prawidłowym adresem URL.
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
Sprawdza, czy wartość jest prawidłowym adresem URI, czyli właściwie ciągiem zaczynającym się od składniowo poprawnego schematu.
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false