Валидатори на стойности
Трябва бързо и лесно да проверите дали дадена променлива съдържа валиден имейл адрес, например? Тук на помощ идва 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() за очакваните типове, която хвърля изключение, ако не успее.
Очаквани видове
Очакваните типове образуват низ, състоящ се от един или повече
варианти, разделени с вертикална черта |
, podobně jako se zapisují typy v PHP
(např. 'int|string|bool')
. Приема се и нулевият запис ?int
.
Масив, в който всички елементи имат определен тип, се записва като
int[]
.
Някои типове могат да бъдат последвани от двоеточие и дължина
:length
или диапазон. :[min]..[max]
Например string:10
(низ от
10 байта), float:10..
(число от 10 или повече), array:..10
(масив от до
десет елемента) или list:10..20
(списък от 10 до 20 елемента), или
регулярният израз u 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, délka je 15 bytů
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