Валідатори значень
Потрібно швидко та просто перевірити, чи є в змінній, наприклад, дійсна електронна адреса? Для цього вам знадобиться 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 |
порожнє значення: '' , null , false |
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 |
|
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