Валидаторы значений
Нужно быстро и просто проверить, что в переменной, например, действительный адрес электронной почты? Вам пригодится 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