Валидаторы значений

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