Валідатори значень

Потрібно швидко та просто перевірити, чи є в змінній, наприклад, дійсна електронна адреса? Для цього вам знадобиться Nette\Utils\Validators, статичний клас з корисними функціями для валідації значень.

Встановлення:

composer require nette/utils

Усі приклади передбачають створений псевдонім:

use Nette\Utils\Validators;

Основне використання

Клас має ряд методів для перевірки значень, таких як isList(), isUnicode(), isEmail(), isUrl() тощо, для використання у вашому коді:

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

Крім того, він може перевірити, чи є значення так званим очікуваним типом, що є рядком, де окремі варіанти розділені вертикальною рискою |. Таким чином, ми можемо легко перевірити кілька типів за допомогою if():

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

Але це також дає нам можливість створити систему, де очікування потрібно записувати як рядки (наприклад, в анотаціях або конфігурації), а потім перевіряти значення відповідно до них.

До очікуваних типів можна також застосувати вимогу assert(), яка, якщо не виконана, викидає виняток.

Очікувані типи

Очікувані типи утворюють рядок, що складається з одного або декількох варіантів, розділених вертикальною рискою |, подібно до того, як записуються типи в PHP (наприклад, 'int|string|bool'). Також приймається запис nullable ?int.

Масив, де всі елементи мають певний тип, записується у вигляді int[].

За деякими типами може слідувати двокрапка та довжина :length або діапазон :[min]..[max], наприклад, string:10 (рядок довжиною 10 байтів), float:10.. (число 10 і більше), array:..10 (масив до десяти елементів) або list:10..20 (список з 10 до 20 елементів), або регулярний вираз у pattern:[0-9]+.

Огляд типів та правил:

PHP типи
array можна вказати діапазон для кількості елементів
bool  
float можна вказати діапазон для значення
int можна вказати діапазон для значення
null  
object  
resource  
scalar int|float|bool|string
string можна вказати діапазон для довжини в байтах
callable  
iterable  
mixed  
псевдо-типи
list індексований масив, можна вказати діапазон для кількості елементів
none порожнє значення: '', nullfalse
number int|float
numeric число, включаючи текстове представлення
numericint ціле число, включаючи текстове представлення
unicode рядок UTF-8, можна вказати діапазон для довжини в символах
символьний клас (не може бути порожнім рядком)
alnum всі символи є буквено-цифровими
alpha всі символи є літерами [A-Za-z]
digit всі символи є цифрами
lower всі символи є малими літерами [a-z]
space всі символи є пробілами
upper всі символи є великими літерами [A-Z]
xdigit всі символи є шістнадцятковими цифрами [0-9A-Fa-f]
перевірка синтаксису
pattern регулярний вираз, якому повинен відповідати весь рядок
email E-mail
identifier ідентифікатор PHP
url URL
uri URI
перевірка середовища
class є існуючим класом
interface є існуючим інтерфейсом
directory є існуючою директорією
file є існуючим файлом

Асерції

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

Перевіряє, що значення є одним з очікуваних типів, розділених вертикальною рискою. Якщо ні, викидає виняток Nette\Utils\AssertionException. Слово variable у тексті винятку можна замінити іншим за допомогою параметра $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

Перевіряє, чи елемент під ключем $key у масиві $array є одним з очікуваних типів, розділених вертикальною рискою. Якщо ні, викидає виняток Nette\Utils\AssertionException. Рядок item '%' in array у тексті винятку можна замінити іншим за допомогою параметра $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.

Валідатори

is ($value, string $expected)bool

Перевіряє, чи значення є одним з очікуваних типів, розділених вертикальною рискою.

Validators::is(1, 'int|float');  // true
Validators::is(23, 'int:0..10'); // false
Validators::is('Nette Framework', 'string:15');     // true, довжина 15 байтів
Validators::is('Nette Framework', 'string:8..');    // true
Validators::is('Nette Framework', 'string:30..40'); // false

isEmail (mixed $value): bool

Перевіряє, чи є значення дійсною електронною адресою. Не перевіряється, чи домен дійсно існує, перевіряється лише синтаксис. Функція враховує також майбутні TLD, які можуть бути також в unicode.

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

isInRange (mixed $value, array $range)bool

Перевіряє, чи значення знаходиться в заданому діапазоні [min, max], де верхню або нижню межу можна опустити (null). Можна порівнювати числа, рядки та об'єкти DateTime.

Якщо відсутні обидві межі ([null, null]) або значення є null, повертає 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

Перевіряє, чи є значення 0, '', false або null.

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

isNumeric (mixed $value)bool

Перевіряє, чи є значення числом або числом, записаним у рядку.

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

Перевіряє, чи є значення цілим числом або цілим числом, записаним у рядку.

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

Перевіряє, чи є значення синтаксично дійсним ідентифікатором у PHP, наприклад, для назв класів, методів, функцій тощо.

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

isBuiltinType (string $type)bool

Перевіряє, чи є $type вбудованим типом PHP. В іншому випадку це назва класу.

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

isTypeDeclaration (string $type)bool

Перевіряє, чи задана декларація типу є синтаксично правильною.

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

Перевіряє, чи є $type одним з внутрішніх типів self, parent, static.

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

isUnicode (mixed $value)bool

Перевіряє, чи є значення дійсним рядком UTF-8.

Validators::isUnicode('nette'); // true
Validators::isUnicode('');      // true
Validators::isUnicode("\xA0");  // false

isUrl (mixed $value): bool

Перевіряє, чи є значення дійсною 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

Перевіряє, чи є значення дійсною URI-адресою, тобто фактично рядком, що починається синтаксично дійсним схемою.

Validators::isUri('https://nette.org');           // true
Validators::isUri('mailto:gandalf@example.org');  // true
Validators::isUri('nette.org');                   // false
версія: 4.0