Валидаторы значений
*******************
.[perex]
Нужно быстро и просто проверить, содержит ли переменная, например, корректный адрес электронной почты? Тогда вам пригодится [api:Nette\Utils\Validators] - статический класс с полезными функциями для проверки значений.
Установка:
```shell
composer require nette/utils
```
Во всех примерах предполагается, что определён такой псевдоним класса:
```php
use Nette\Utils\Validators;
```
Основы использования
====================
Класс `Validators` предоставляет множество методов для проверки значений, таких как [#isUnicode()], [#isEmail()], [#isUrl()] и других, для использования в вашем коде:
```php
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException('Invalid email address provided.');
}
```
Кроме того, он умеет проверять, отвечает ли значение так называемым [ожидаемым типам |#Ожидаемые типы] - строке, в которой отдельные варианты разделены вертикальной чертой `|`. Благодаря этому легко проверять объединённые типы с помощью [#is()]:
```php
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]+`.
Обзор типов и правил:
.[wide]
| Типы PHP ||
|--------------------------
| `array` .{width: 140px} | можно задать диапазон числа элементов
| `bool` |
| `boolean` | псевдоним для `bool`
| `float` | можно задать диапазон значения
| `int` | можно задать диапазон значения
| `integer` | псевдоним для `int`
| `null` |
| `object` |
| `resource` |
| `scalar` | `int|float|bool|string`
| `string` | можно задать диапазон длины в байтах
| `callable` |
| `iterable` |
| `mixed` |
|------------------------------------------------
| Псевдотипы ||
|------------------------------------------------
| `list` | индексированный массив, можно задать диапазон числа элементов
| `none` | пустое значение: `''`, `null`, `false`, `0`, `0.0`, `[]`
| `number` | `int|float`
| `numeric` | [число, в том числе в строковом представлении |#isNumeric()]
| `numericint`| [целое число, в том числе в строковом представлении |#isNumericInt()]
| `unicode` | [строка UTF-8 |#isUnicode()], можно задать диапазон длины в символах
|------------------------------------------------
| Классы символов (строка не должна быть пустой) ||
|------------------------------------------------
| `alnum` | все символы - буквы или цифры
| `alpha` | все символы - буквы `[A-Za-z]`
| `digit` | все символы - цифры
| `lower` | все символы - строчные буквы `[a-z]`
| `space` | все символы - пробельные
| `upper` | все символы - заглавные буквы `[A-Z]`
| `xdigit` | все символы - шестнадцатеричные цифры `[0-9A-Fa-f]`
|------------------------------------------------
| Проверка синтаксиса ||
|------------------------------------------------
| `pattern` | регулярное выражение, которому должна соответствовать **вся** строка
| `email` | [Email |#isEmail()]
| `identifier`| [идентификатор PHP |#isPhpIdentifier()]
| `url` | [URL |#isUrl()]
| `uri` | [URI |#isUri()]
|------------------------------------------------
| Проверка окружения ||
|------------------------------------------------
| `class` | существующее имя класса
| `interface` | существующее имя интерфейса
| `directory` | путь к существующему каталогу
| `file` | путь к существующему файлу
Утверждение
===========
assert($value, string $expected, string $label='variable'): void .[method]
--------------------------------------------------------------------------
Проверяет, что значение относится к одному из [ожидаемых типов |#Ожидаемые типы], разделённых чертой. Если нет, выбрасывает [api:Nette\Utils\AssertionException]. Слово `variable` в сообщении исключения можно заменить параметром `$label`.
```php
Validators::assert('Nette', 'string:5'); // OK (строка 'Nette' занимает 5 байт)
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 .[method]
---------------------------------------------------------------------------------------------------------------------
Проверяет, что элемент с ключом `$key` в массиве `$array` относится к одному из [ожидаемых типов |#Ожидаемые типы], разделённых чертой. Если нет, выбрасывает [api:Nette\Utils\AssertionException]. Строку `item '%' in array` в сообщении исключения можно заменить параметром `$label`.
```php
$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 .[method]
--------------------------------------------
Проверяет, относится ли значение к одному из [ожидаемых типов |#Ожидаемые типы], разделённых чертой.
```php
Validators::is(1, 'int|float'); // true
Validators::is(23, 'int:0..10'); // false (23 вне диапазона 0-10)
Validators::is('Nette Framework', 'string:15'); // true, длина 15 байт
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
```
everyIs(iterable $values, string $expected): bool .[method]
-----------------------------------------------------------
Проверяет, относится ли каждое значение итерируемого объекта к одному из [ожидаемых типов |#Ожидаемые типы], разделённых чертой. Работает как [#is()], применённый к каждому элементу.
```php
$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string'); // false (2020 не строка)
Validators::everyIs($list, 'string|int'); // true
```
isEmail(string $value): bool .[method]
--------------------------------------
Проверяет, что значение является корректным адресом электронной почты. Он не проверяет, существует ли домен на самом деле, проверяется только синтаксис. Функция учитывает и будущие [домены верхнего уровня|https://ru.wikipedia.org/wiki/Домен_верхнего_уровня], которые могут быть и в Unicode.
```php
Validators::isEmail('example@nette.org'); // true
Validators::isEmail('example@localhost'); // false
Validators::isEmail('nette'); // false
```
isInRange(mixed $value, array $range): bool .[method]
-----------------------------------------------------
Проверяет, находится ли значение в заданном диапазоне `[min, max]`, где верхнюю или нижнюю границу можно опустить (`null`). Сравнивать можно числа, строки и объекты DateTime.
Если отсутствуют обе границы (`[null, null]`) или значение равно `null`, возвращается `false`.
```php
Validators::isInRange(5, [0, 5]); // true
Validators::isInRange(23, [null, 5]); // false
Validators::isInRange(23, [5]); // true (равнозначно [5, null])
Validators::isInRange(1, [5]); // false
```
isNone(mixed $value): bool .[method]
------------------------------------
Проверяет, равно ли значение `0`, `''`, `false`, `null`, `0.0` или `[]`.
```php
Validators::isNone(0); // true
Validators::isNone(''); // true
Validators::isNone(false); // true
Validators::isNone(null); // true
Validators::isNone('nette'); // false
```
isNumeric(mixed $value): bool .[method]
---------------------------------------
Проверяет, является ли значение числом или числом, записанным строкой.
```php
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 .[method]
------------------------------------------
Проверяет, является ли значение целым числом или целым числом, записанным строкой.
```php
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 .[method]
----------------------------------------------
Проверяет, является ли значение синтаксически корректным идентификатором PHP (например, для имён классов, методов, функций и так далее).
```php
Validators::isPhpIdentifier(''); // false
Validators::isPhpIdentifier('Hello1'); // true
Validators::isPhpIdentifier('1Hello'); // false
Validators::isPhpIdentifier('one two'); // false
```
isBuiltinType(string $type): bool .[method]
-------------------------------------------
Определяет, является ли `$type` встроенным типом PHP (например, `string`, `int`, `array`, `bool`). Иначе предполагается, что это имя класса.
```php
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
```
isTypeDeclaration(string $type): bool .[method]
-----------------------------------------------
Проверяет, синтаксически ли корректна заданная строка объявления типа по правилам объявления типов PHP (включая объединения, пересечения и типы в дизъюнктивной нормальной форме).
```php
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 .[method]
--------------------------------------------
Определяет, является ли `$name` одним из внутренних ключевых слов типов `self`, `parent` или `static`.
```php
Validators::isClassKeyword('self'); // true
Validators::isClassKeyword('Foo'); // false
```
isUnicode(mixed $value): bool .[method]
---------------------------------------
Проверяет, является ли значение корректной строкой UTF-8.
```php
Validators::isUnicode('nette'); // true
Validators::isUnicode(''); // true
Validators::isUnicode("\xA0"); // false (некорректная последовательность UTF-8)
```
isUrl(string $value): bool .[method]
------------------------------------
Проверяет, является ли значение корректным абсолютным URL-адресом по RFC 3986.
```php
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 (часть userinfo этой функцией не проверяется)
Validators::isUrl('nette.org'); // false (нет схемы)
```
isUri(string $value): bool .[method]
------------------------------------
Проверяет, что значение является корректным адресом URI, то есть строкой, начинающейся с синтаксически корректной схемы, за которой следует двоеточие (например, `http:`, `https:`, `mailto:`, `ftp:`).
```php
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false (нет схемы)
```
Валидаторы значений
Нужно быстро и просто проверить, содержит ли переменная,
например, корректный адрес электронной почты? Тогда вам пригодится Nette\Utils\Validators – статический
класс с полезными функциями для проверки значений.
Установка:
composer require nette/utils
Во всех примерах предполагается, что определён такой псевдоним
класса:
use Nette\Utils\Validators;
Основы использования
Класс Validators предоставляет множество методов для проверки
значений, таких как isUnicode(), isEmail(), isUrl() и других, для использования в вашем коде:
if (!Validators::isEmail($email)) {
throw new InvalidArgumentException('Invalid email address provided.');
}
Кроме того, он умеет проверять, отвечает ли значение так называемым ожидаемым типам – строке, в которой отдельные
варианты разделены вертикальной чертой |. Благодаря этому легко
проверять объединённые типы с помощью is():
if (!Validators::is($val, 'int|string|bool')) {
// Обработка неверного типа...
}
Это также позволяет создавать системы, где ожидания нужно записывать
строками (например, в аннотациях или конфигурации), а затем проверять
по ним значения.
Вы можете также объявить утверждение, которое выбросит
исключение, если ожидание не выполнено.
Ожидаемые типы
Ожидаемые типы образуют строку из одного или нескольких вариантов,
разделённых чертой |, похоже на то, как типы записываются в 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 |
|
boolean |
псевдоним для bool |
float |
можно задать диапазон значения |
int |
можно задать диапазон значения |
integer |
псевдоним для int |
null |
|
object |
|
resource |
|
scalar |
`int |
float |
bool |
string` |
string |
можно задать диапазон длины в байтах |
|
|
|
callable |
|
|
|
|
iterable |
|
|
|
|
mixed |
|
|
|
|
| Псевдотипы |
|
|
|
list |
индексированный массив, можно задать диапазон числа элементов |
|
|
|
none |
пустое значение: '', null, false, 0,
0.0, [] |
|
|
|
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 |
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 (строка 'Nette' занимает 5 байт)
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
Проверяет, что элемент с ключом $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 (23 вне диапазона 0-10)
Validators::is('Nette Framework', 'string:15'); // true, длина 15 байт
Validators::is('Nette Framework', 'string:8..'); // true
Validators::is('Nette Framework', 'string:30..40'); // false
everyIs (iterable $values, string
$expected): bool
Проверяет, относится ли каждое значение итерируемого объекта к
одному из ожидаемых типов, разделённых чертой.
Работает как is(), применённый к каждому элементу.
$list = ['Nette', 'Framework', 2020];
Validators::everyIs($list, 'string'); // false (2020 не строка)
Validators::everyIs($list, 'string|int'); // true
isEmail (string $value): bool
Проверяет, что значение является корректным адресом электронной
почты. Он не проверяет, существует ли домен на самом деле, проверяется
только синтаксис. Функция учитывает и будущие домены верхнего уровня,
которые могут быть и в 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 (равнозначно [5, null])
Validators::isInRange(1, [5]); // false
isNone (mixed $value): bool
Проверяет, равно ли значение 0, '', false, null,
0.0 или [].
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 (например,
string, int, array, bool). Иначе предполагается, что
это имя класса.
Validators::isBuiltinType('string'); // true
Validators::isBuiltinType('Foo'); // false
isTypeDeclaration (string
$type): bool
Проверяет, синтаксически ли корректна заданная строка объявления
типа по правилам объявления типов PHP (включая объединения, пересечения
и типы в дизъюнктивной нормальной форме).
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
Определяет, является ли $name одним из внутренних ключевых слов
типов 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 (некорректная последовательность UTF-8)
isUrl (string $value): bool
Проверяет, является ли значение корректным абсолютным URL-адресом по
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 (часть userinfo этой функцией не проверяется)
Validators::isUrl('nette.org'); // false (нет схемы)
isUri (string $value): bool
Проверяет, что значение является корректным адресом URI, то есть
строкой, начинающейся с синтаксически корректной схемы, за которой
следует двоеточие (например, http:, https:, mailto:,
ftp:).
Validators::isUri('https://nette.org'); // true
Validators::isUri('mailto:gandalf@example.org'); // true
Validators::isUri('nette.org'); // false (нет схемы)