[Go to site: main page, start]

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, klasa statyczna z przydatnymi funkcjami do walidacji wartości.

Instalacja:

composer require nette/utils

Wszystkie przykłady zakładają, że zdefiniowany jest następujący alias klasy:

use Nette\Utils\Validators;

Podstawowe użycie

Klasa Validators udostępnia liczne metody do sprawdzania wartości, takie jak isUnicode(), isEmail(), isUrl() itd., do użycia w Twoim kodzie:

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

Ponadto potrafi sprawdzić, czy wartość spełnia tzw. oczekiwane typy, czyli string, w którym poszczególne opcje oddzielone są pionową kreską |. Dzięki temu łatwo sprawdzisz typy sumaryczne za pomocą is():

if (!Validators::is($val, 'int|string|bool')) {
	// obsługa nieprawidłowego typu...
}

Pozwala to też tworzyć systemy, w których oczekiwania trzeba zapisywać jako stringi (np. w adnotacjach albo konfiguracji), a następnie walidować wobec nich wartości.

Możesz też zadeklarować asercję, która zgłosi wyjątek, jeśli oczekiwanie nie zostanie spełnione.

Oczekiwane typy

Oczekiwane typy tworzą string złożony z jednego lub więcej wariantów oddzielonych kreską |, podobnie jak zapisuje się typy w PHP (np. 'int|string|bool'). Akceptowany jest również zapis nullable ?int.

Tablicę, w której wszystkie elementy są określonego typu, zapisuje się w postaci int[].

Po niektórych typach może następować dwukropek i długość :length albo zakres :[min]..[max], np. string:10 (string o długości 10 bajtów), float:10.. (liczba 10 lub większa), array:..10 (tablica o najwyżej dziesięciu elementach) albo list:10..20 (lista o 10 do 20 elementach), albo wyrażenie regularne, jak pattern:[0-9]+.

Przegląd typów i reguł:

Typy PHP
array można podać zakres liczby elementów
bool  
boolean alias dla bool
float można podać zakres wartości
int można podać zakres wartości
integer alias dla int
null  
object  
resource  
scalar `int float bool string`
string można podać zakres długości w bajtach      
callable        
iterable        
mixed        
Pseudotypy      
list tablica indeksowana, można podać zakres liczby elementów      
none pusta wartość: '', null, false, 0, 0.0[]      
number `int float`    
numeric liczba wraz z reprezentacją tekstową      
numericint liczba całkowita wraz z reprezentacją tekstową      
unicode string UTF-8, można podać zakres długości w znakach      
Klasa znaków (nie może być pustym stringiem)      
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ą białymi znakami      
upper wszystkie znaki są wielkimi literami [A-Z]      
xdigit wszystkie znaki są cyframi szesnastkowymi [0-9A-Fa-f]      
Walidacja składni      
pattern wyrażenie regularne, do którego musi pasować cały string      
email e-mail      
identifier identyfikator PHP      
url URL      
uri URI      
Walidacja środowiska      
class jest istniejącą nazwą klasy      
interface jest istniejącą nazwą interfejsu      
directory jest ścieżką istniejącego katalogu      
file jest ścieżką istniejącego pliku      

Asercja

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

Sprawdza, czy wartość jest jednym z oczekiwanych typów oddzielonych kreską. Jeśli nie, zgłasza Nette\Utils\AssertionException. Słowo variable w komunikacie wyjątku można zastąpić parametrem $label.

Validators::assert('Nette', 'string:5'); // OK (string 'Nette' ma 5 bajtów)
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

Sprawdza, czy element o kluczu $key w tablicy $array jest jednym z oczekiwanych typów oddzielonych kreską. Jeśli nie, zgłasza Nette\Utils\AssertionException. String item '%' in array w komunikacie wyjątku można zastąpić parametrem $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 kreską.

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

everyIs (iterable $values, string $expected)bool

Sprawdza, czy każda wartość w obiekcie iterowalnym jest jednym z oczekiwanych typów oddzielonych kreską. Działa jak is() zastosowane do każdego elementu.

$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string');     // false (2020 nie jest stringiem)
Validators::everyIs($list, 'string|int'); // true

isEmail (string $value): bool

Sprawdza, czy wartość jest prawidłowym adresem e-mail. Nie weryfikuje, czy domena rzeczywiście istnieje, sprawdzana jest tylko składnia. Funkcja uwzględnia również przyszłe domeny najwyższego poziomu, 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ść mieści się w podanym zakresie [min, max], przy czym górną albo dolną granicę można pominąć (null). Porównywać można liczby, stringi i obiekty DateTime.

Jeśli brakuje obu granic ([null, null]) albo wartością jest null, zwraca false.

Validators::isInRange(5, [0, 5]);     // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]);       // true (odpowiednik [5, null])
Validators::isInRange(1, [5]);        // false

isNone (mixed $value): bool

Sprawdza, czy wartością jest 0, '', false, null, 0.0 albo [].

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ścią jest liczba albo liczba zapisana jako string.

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 (zapis naukowy nie jest akceptowany)

isNumericInt (mixed $value)bool

Sprawdza, czy wartością jest liczba całkowita albo liczba całkowita zapisana jako string.

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 prawidłowym identyfikatorem w PHP (np. dla nazw klas, metod, funkcji itd.).

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

isBuiltinType (string $type)bool

Ustala, czy $type jest typem wbudowanym w PHP (np. string, int, array, bool). W przeciwnym razie zakłada, że jest to nazwa klasy.

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

isTypeDeclaration (string $type)bool

Sprawdza, czy podany string z deklaracją typu jest składniowo prawidłowy według reguł deklaracji typów PHP (łącznie z typami sumarycznymi, przecięciowymi i 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

Ustala, czy $name jest jednym z wewnętrznych słów kluczowych typów self, parent albo static.

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

isUnicode (mixed $value)bool

Sprawdza, czy wartość jest prawidłowym stringiem UTF-8.

Validators::isUnicode('nette'); // true
Validators::isUnicode('');      // true
Validators::isUnicode("\xA0");  // false (nieprawidłowa sekwencja UTF-8)

isUrl (string $value): bool

Sprawdza, czy wartość jest prawidłowym bezwzględnym adresem URL zgodnym z 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 (część userinfo nie jest walidowana przez tę funkcję)
Validators::isUrl('nette.org');                   // false (brak schematu)

isUri (string $value): bool

Sprawdza, czy wartość jest prawidłowym adresem URI, czyli stringiem zaczynającym się od składniowo prawidłowego schematu, po którym następuje dwukropek (np. http:, https:, mailto:, ftp:).

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false (brak schematu)
wersja: 4.x