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

Нужно быстро и просто проверить, содержит ли переменная, например, корректный адрес электронной почты? Тогда вам пригодится 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 (нет схемы)
версия: 4.x