WebGeeker-Validation: мощный PHP-инструмент для проверки параметров
Инструмент WebGeeker-Validation предназначен для проверки законности параметров API-интерфейса. При реализации серверных API-интерфейсов необходимо проверять значения каждого параметра, чтобы избежать ошибок при вводе данных в систему. Это может быть трудоёмкой задачей, но необходимой. Кроме того, PHP является слабо типизированным языком, поэтому требуется не только проверка значений, но и типов данных.
Этот инструмент разработан для упрощения процесса проверки параметров и уменьшения объёма кода. Он поддерживает различные типы данных: целые числа, числа с плавающей точкой, логические значения, строки, массивы, объекты, файлы и даты. Также он позволяет проверять параметры вложенных структур и поддерживает условные проверки.
Основные возможности:
Пример использования:
$params = $request->query(); // Получение GET-параметров
// Проверка (выбросит исключение при неудачной проверке)
Validation::validate($params, [
"offset" => "IntGe:0", // Параметр "offset" должен быть больше или равен 0
"count" => "Required|IntGeLe:1,200", // Параметр "count" обязателен и должен находиться в диапазоне от 1 до 200
]);
Для получения дополнительной информации о настройке и использовании инструмента рекомендуется обратиться к документации. Проверка данных: особенности и примеры использования
Проверка данных имеет проблему «одно слово — много значений». Это похоже на изучение английского языка, когда у некоторых слов есть несколько значений. Разные контексты приводят к разным значениям. Например, слово «present» может означать «представлять», «присутствовать» или «подарок». Такие слова вызывают затруднения, и трудно понять, что они означают.
Для решения этих проблем был разработан инструмент проверки данных.
1.2 Особенности инструмента:
Пример простой проверки
Этот пример демонстрирует проверку параметров запроса на получение списка жалоб пользователей (обратите внимание на условные проверки и проверки вложенных структур):
// Правила проверки
$validations = [
"offset" => "IntGe:0", // Параметр offset должен быть больше или равен 0
"count" => "Required|IntGeLe:1,200", // Параметр count является обязательным и должен быть больше или равен 1 и меньше или равен 200
"type" => "IntIn:1,2", // Параметр type может принимать значения 1 или 2
"state" => [
'IfIntEq:type,1|IntEq:0', // Если type == 1 (рекомендация), то параметр state должен быть равен 0
'IfIntEq:type,2|IntIn:0,1,2', // Если type == 2 (жалоба пользователя), то параметр state может принимать значения 1, 2 или 3
],
"search.keyword" => "StrLenGeLe:1,100", // search.keyword должен быть строкой длиной от 1 до 100 символов
"search.start_time" => "Date", // search.start_time должна быть допустимой датой
"search.end_time" => "Date", // search.end_time должна быть допустимой датой
];
// Проверяемые параметры
$params = [
"offset" => 0, // Начало с 0-й записи
"count" => 10, // Возврат максимум 10 записей
"type" => 2, // 1 - рекомендация, 2 - жалоба пользователя
"state" => 0, // 0 - ожидает обработки, 1 - обрабатывается, 2 - обработано
"search" => [ // Условия поиска
"keyword" => 'hardware fault', // Ключевое слово
"start_time" => "2018-01-01", // Начальная дата
"end_time" => "2018-01-31", // Конечная дата
],
];
// Проверка (если проверка не пройдена, будет выдано исключение)
Validation::validate($params, $validations);
2 Установка
Инструмент устанавливается через Composer:
composer require webgeeker/validation:^0.5.2
3 Быстрый старт
3.1 Пример использования (без фреймворка)
В этом примере проверяется $_POST
(форма POST) и демонстрируется базовое использование:
<?php
include "vendor/autoload.php";
use WebGeeker\Validation\Validation;
try {
Validation::validate($_POST, [
"offset" => "IntGe:0", // Параметр offset должен быть больше или равен 0
"count" => "Required|IntGeLe:1,200", // Параметр count является обязательным и должен быть больше или равен 1 и меньше или равен 200
]);
} catch (\Exception $e) {
echo $e->getMessage();
}
Примечание: если проверка не проходит, генерируется исключение, содержащее сообщение об ошибке.
3.2 Обработка ошибок при неудачной проверке
Если проверка не проходит успешно, метод Validation::validate(...)
генерирует исключение. Рекомендуется обрабатывать эти исключения во фреймворке, извлекать сообщения об ошибках и возвращать их клиенту.
3.3 Использование в сторонних фреймворках
Сторонние фреймворки обычно предоставляют объект Request, который можно использовать для получения параметров GET или POST (например, Laravel):
//$params = $request->query(); // Получение параметров GET
$params = $request->request->all(); // Получение всех параметров POST
// Проверка (если проверка не пройдёт, будет выброшено исключение)
Validation::validate($params, [
// Здесь пропущены правила проверки
]);
4 Подробное использование
4.1 Проверка целочисленных параметров
Все проверки целых чисел начинаются с «Int». Они используются для проверки целочисленных значений (например, 123
) или целочисленных строк (например, "123"
). Другие типы данных не соответствуют.
"size" => "IntGeLe:1,100"
Это правило проверки требует, чтобы параметр «size» был целым числом и находился в диапазоне от 1 до 100.
Полный список целочисленных проверок см. в приложении A.1.
4.2 Проверка параметров с плавающей запятой
Все проверки с плавающей запятой начинаются с «Float». Они используются для проверки значений с плавающей запятой (например, 1.0
), строк с плавающей запятой (например, "1.0"
), целочисленных значений (например, 123
) или целочисленных строк (например, "123"
). Другие типы данных не соответствуют.
"height" => "FloatGeLe:0.0,100.0"
Это правило проверки требует, чтобы параметр «height» был значением с плавающей запятой и находился в диапазоне от 0 до 100,0.
Полный список проверок с плавающей запятой см. в приложении А.2.
4.3 Проверка логических параметров
Логические проверки:
true
, false
, "true"
, "false"
(строки игнорируют регистр).true
, "true"
(строки игнорируют регистр).false
, "false"
(строки игнорируют регистр).true
, false
, "true"
, "false"
, 1
, 0
, "1"
, "0"
, "yes"
, "no"
, "y"
, "n"
(строки игнорируют регистр)true
, "true"
, 1
, "1"
, "yes"
, "y"
(строки игнорируют регистр)false
, "false"
, 0
, "0"
, "no"
, "n"
(строки игнорируют регистр)Пример:
"accept" => "BoolSmart"
Полный список логических проверок см. в приложении А.3.
4.4 Проверка строковых параметров
Не все строковые проверки начинаются с «Str». Они принимают только строковые данные, другие типы данных не подходят.
Пример 1:
"name" => "StrLenGeLe:2,20"
Это правило проверки требует, чтобы параметр «name» был строкой, длина которой находится в диапазоне от 2 до 20 (длина строки измеряется с помощью mb_strlen()
).
Пример 2:
"comment" => "ByteLenLe:1048576"
Это правило проверки требует, чтобы параметр «comment» был строкой с длиной байта не более 1048576 (длина байта измеряется с помощью strlen()
).
Пример 3:
"email" => "Email"
Это правило проверки требует, чтобы параметр «email» был действительным адресом электронной почты.
Пример 4 (проверка регулярного выражения):
"phone" => "Regexp:/^1(3[0-9]|4[579]|5[0-35-9]|7[0135678]|8[0-9]|66|9[89])\d{8}$/"
Это правило проверки требует, чтобы параметр «phone» был действительным номером телефона.
Относительно того, какие специальные символы в регулярном выражении необходимо экранировать, достаточно использовать функцию preg_match()
, например:
preg_match('/^string$/', $string);
``` Затем нужно скопировать два символа '/' и то, что между ними, и поместить после Regexp:
$matched = preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", "你好");
Обратите внимание, что в конце регулярного выражения требуется добавить 'u', что означает включение режима UTF8.
В нашей библиотеке проверки код должен выглядеть так:
Validation::validate(["param" => "你好"], ["param" => "Regexp:/^[\x{4e00}-\x{9fa5}]+$/"]);
Обратите внимание, что в конце регулярного выражения не требуется добавлять 'u'.
Полный список строковых валидаторов можно найти в приложении A.4.
### 4.5 Валидация массивов, объектов, файлов и параметров даты и времени
См. приложения A.5–A.8.
### 4.6 Валидаторы-коннекторы (AND)
Одно правило может содержать несколько валидаторов, которые связаны между собой как «И», например:
```php
"file" => "FileMaxSize:10m|FileImage"
Этот валидатор требует, чтобы параметр «file» был изображением и размером не более 10 мегабайт.
Пример:
"size" => "Required|StrIn:small,middle,large"
Эта проверка требует, чтобы параметр «size» был строкой «small», «middle» или «large».
Например, при создании пользователя необходимо предоставить все данные, но при обновлении информации о пользователе не обязательно предоставлять все данные — достаточно обновить те, которые были предоставлены.
$validations = [
"name" => "Required|StrLenGeLe:2,20",
"sex" => "Required|IntIn:0,1",
"age" => "Required|IntGeLe:1,200",
];
$userInfo = [
"name" => "tom",
"sex" => "0",
"age" => "10",
];
Validation::validate($userInfo, $validations); // Создание пользователя
unset($userInfo["age"]); // Удаление поля age
Validation::validate($userInfo, $validations, true); // Обновление информации о пользователе
Обратите внимание на последнюю строку кода: третий параметр функции validate() равен true, что означает игнорирование всех валидаторов типа Required.
Таким образом, мы можем использовать один набор правил для создания и обновления информации о пользователях.
Следующий пример показывает проверку вложенных массивов и объектов:
$params = [
"comments" => [
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
]
]
];
$validations = [
"comments[*].title" => "Required|StrLenGeLe:2,50",
"comments[*].content" => "Required|StrLenGeLe:2,500",
];
Validation::validate($params, $validations);
Условные валидаторы начинаются с «If».
Если условие не выполняется, то валидация текущего правила пропускается, и оно не проверяется.
Например, вы хотите нанять группу моделей, для мужчин рост должен быть выше 180 см, а для женщин — выше 170 см. Проверка может быть выполнена следующим образом:
$validations = [
"sex" => "StrIn:male,female",
"height" => [
"IfStrEq:sex,male|IntGe:180",
"IfStrEq:sex,female|IntGe:170",
],
];
Параметры «sex» и «height» проверяются по разным правилам.
За исключением IfExist и IfNotExist, остальные условные валидаторы требуют, чтобы условный параметр существовал. Если вы хотите, чтобы условный параметр был необязательным, вы можете объединить IfExist или IfNotExist с ним, например:
"IfExist:sex|IfStrEq:sex,male|IntGe:180"
Примечание: основная цель разработки условных валидаторов — применять разные правила проверки к другому параметру в зависимости от значения первого параметра. «IfXxx:» должен следовать за другим параметром, а не текущим, это важно помнить. Например, в этом примере проверка основана на значении параметра «sex», которое применяется к параметру «height». Если проверка не пройдена, метод Validation::validate()
выбросит исключение, которое будет содержать текстовое описание ошибки.
Однако это описание может быть не очень удобным для пользователя. Мы можем настроить эти тексты с помощью двух псевдо-валидаторов:
Alias
используется для настройки имён параметров (это имя будет объединено с внутренним шаблоном сообщения об ошибке для создания окончательного текста описания ошибки).>>>
используется для настройки текста описания ошибки (этот текст полностью заменит шаблонное сообщение об ошибке).Рассмотрим следующий пример:
$params = [
"title" => "a",
];
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50",
]); // Выбросит ошибку: «title» должен быть от 2 до 50 символов
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|Alias:标题", // Настроим имя параметра
]); // Выбросит ошибку: «标题» должен быть от 2 до 50 символов
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|>>>:标题长度应在2~50之间", // Настроим текст ошибки
]); // Выбросит ошибку: длина заголовка должна быть в пределах от 2 до 50
См. приложение A.10 для получения более подробной информации.
Начиная с версии 0.4:
$langCode2ErrorTemplates
, чтобы упростить формат (спасибо @gitHusband за предложение).$langCodeToErrorTemplates
всё ещё работает, и нет необходимости изменять существующий код (см. следующий раздел). Если новая и старая таблицы перевода предоставляются одновременно, приоритет отдаётся новой таблице, а если новая таблица не найдена, используется старая.Чтобы поддерживать интернационализацию, необходимо создать собственный класс, который наследуется от \WebGeeker\Validation\Validation
и переопределяет два статических члена:
$langCode2ErrorTemplates
предоставляет таблицу перевода для шаблонов сообщений об ошибках. Полный список шаблонов сообщений об ошибках можно найти в члене $errorTemplates
класса \WebGeeker\Validation\Validation
.$langCodeToTranslations
предоставляет таблицы перевода для имён настраиваемых параметров (Alias
) и текстов описаний ошибок (>>>
).Вот пример класса:
class MyValidation extends Validation
{
// Таблица перевода шаблонов сообщений об ошибках
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
'Int' => '“{{param}}”必須是整數', // 🌝
'IntGt' => '“{{param}}”必須大於 {{min}}',
'Str' => '“{{param}}”必須是字符串',
],
"en-us" => [
'Int' => '{{param}} must be an integer',
'IntGt' => '{{param}} must be greater than {{min}}',
'Str' => '{{param}} must be a string',
],
];
// Таблица перевода
protected static $langCodeToTranslations = [
"zh-tw" => [
"变量" => "變量", // 🌙
"变量必须是整数" => "變量必須是整數", // ⭐
],
"en-us" => [
"变量" => "variable",
"变量必须是整数" => "variable must be an integer",
],
];
}
Обратите внимание:
Используйте этот класс MyValidation
для проверки, чтобы реализовать перевод текста.
MyValidation::setLangCode("zh-tw"); // Устанавливаем код языка
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // Нет Alias или >>>, только перевод шаблона сообщения об ошибке (соответствует строке 🌝)
]); // Выбрасывает ошибку: «var» должен быть целым числом
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:变量", // Есть Alias, кроме перевода шаблона сообщения об ошибке, также переводит имя параметра (соответствует строке 🌙)
]); //
Если указан неправильный код языка или перевод не найден, перевод не выполняется, и выводится исходный текст.
(Если вы используете версию 0.4 или выше, рекомендуется использовать новую схему интернационализации (см. предыдущий раздел), которая более лаконична).
Для поддержки интернационализации необходимо создать пользовательский класс, который наследует от \WebGeeker\Validation\Validation
, и переопределить два статических члена:
$langCodeToErrorTemplates
предоставляет таблицу перевода шаблонов сообщений об ошибках. Полную таблицу шаблонов сообщений об ошибках можно найти в члене $errorTemplates
класса \WebGeeker\Validation\Validation
.$langCodeToTranslations
предоставляет таблицу перевода имён настраиваемых параметров (Alias
) и текстов описания ошибок (>>>
).Приведён пример класса:
class MyValidation extends Validation
{
// Таблица перевода шаблонов сообщений об ошибках
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
"“{{param}}”必须是整数" => "“{{param}}”必須是整數", // 🌝
"“{{param}}”必须是字符串" => "“{{param}}”必須是字符串",
],
"en-us" => [
"“{{param}}”必须是整数" => "{{param}} must be a integer",
"“{{param}}”必须是字符串" => "{{param}} must be a string",
],
];
// Таблица перевода
protected static $langCodeToTranslations = [
"zh-tw" => [
"变量" => "變量", // 🌙
"变量必须是整数" => "變量必須是整數", // ⭐
],
"en-us" => [
"变量" => "variable",
"变量必须是整数" => "variable must be an integer",
],
];
}
Обратите внимание:
Этот класс MyValidation
используется для проверки и реализации перевода текста.
MyValidation::setLangCode("zh-tw"); // Устанавливаем код языка
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // Нет Alias или >>>, только перевод шаблона сообщения об ошибке (соответствует строке 🌝)
]); // Выбрасывает ошибку: «var» должен быть целым числом
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:变量", // Есть Alias, кроме перевода шаблона сообщения об ошибке, также переводится имя параметра (соответствует строке 🌙)
]); // Будет выдано исключение: «Переменная» должна быть целым числом.
Если предоставлен некорректный код языка, либо не найден перевод текста, то он не переводится и выводится исходный текст.
Здесь следует подчеркнуть, что не следует злоупотреблять функцией пользовательского валидатора. Если связанная с бизнесом проверка используется редко, можно рассмотреть возможность её непосредственной реализации на PHP или создания PHP-функции для прямого вызова, а не включения в систему проверки webgeeker-validation.
В следующем примере определяется класс CustomCaseValidation
, который предоставляет метод validateCustomStartWith()
и шаблон сообщения об ошибке $errorTemplates
, реализуя пользовательский валидатор CustomStartWith
.
(Не пугайтесь количества строк кода, на самом деле их не так много, половина из них — комментарии)
// Этот класс реализует пользовательский валидатор CustomStartWith для проверки того, начинается ли параметр с указанного префикса
class CustomCaseValidation extends Validation
{
// Шаблон сообщения об ошибке при неудачной проверке. Шаблоны дочерних классов объединяются с шаблонами родительских классов во время выполнения, и значения дочерних ключей переопределяют значения родительских ключей
protected static $errorTemplates = [
'CustomStartWith' => '“{{param}}” должен начинаться с "{{prefix}}"',
];
/**
* Метод реализации пользовательского валидатора "CustomStartWith", проверяющий, начинается ли значение входного параметра $value с заданного префикса
*
* @param $value string Значение для проверки
* @param $prefix string Префикс. Если валидатором является "CustomStartWith:head", то это значение равно "head"
* @param $reason string|null Сообщение об ошибке в случае неудачи проверки. Если оно равно null, то генерируется автоматически
* Если в проверке присутствует псевдовалидатор">>>:some reason", то значением этого параметра будет "some reason"
* если псевдовалидатор ">>>" не предоставлен, то значение этого параметра равно null
* @param $alias string Псевдоним параметра, используемый в сообщении об ошибке.
* Если проверка содержит псевдовалидатор"Alias:name", то этот параметр равен "name"
* Если псевдовалидатор "Alias" не указан, например, "name" => "StrLenGeLe:2,30", то этот параметр равен "name"
* @return mixed Возвращает исходное значение параметра $value
* @throws ValidationException Выбрасывает исключение при неудачной проверке
*/
public static function validateCustomStartWith($value, $prefix, $reason, $alias)
{
if (strpos(strval($value), $prefix) === 0)
return $value;
if ($reason !== null)
throw new ValidationException($reason);
$error = self::getErrorTemplate('CustomStartWith'); // Получаем шаблон сообщения об ошибке
$error = str_replace('{{param}}', $alias, $error);
$error = str_replace('{{prefix}}', $prefix, $error);
throw new ValidationException($error);
}
}
Использование:
'name' => 'CustomStartWith:head'
Custom
, например, «CustomAbc», «CustomXyz».\WebGeeker\Validation\Validation
.$errorTemplates
в классе является необязательным, поскольку вы можете напрямую генерировать текст сообщения об ошибке в методе реализации (но тогда функция интернационализации будет недоступна).public static function validateCustomAbc($value, $reason, $alias) {}
$value
— значение для проверки.$reason
— сообщение об ошибке в случае неудачной проверки. Его значение — это строка, предоставленная псевдовалидатором >>>
.$alias
— псевдоним параметра, который используется в сообщении об ошибке. Его значение равно строке, предоставленной псевдовалидатором Alias
.n
параметров, то его метод проверки должен иметь 3 + n
параметра, дополнительные n
параметры должны следовать после параметра $value
.$value
.Далее представлен ещё один пример класса CustomDemoValidation
, реализующего три пользовательских валидатора CustomInt
, CustomIntEq
и CustomIntGeLe
:
/**
* Пример класса пользовательской проверки Demo
*
* Этот класс реализует следующие пользовательские валидаторы:
* CustomInt для проверки того, является ли параметр целым числом
* CustomIntEq для проверки того, что параметр является целым числом и равен указанному значению
* CustomIntGeLe для проверки того, что параметр является целым числом, значение которого находится в диапазоне [min, max]
*/
class CustomDemoValidation extends CustomCaseValidation
{
/**
* @var array Шаблон сообщения об ошибке, которое будет отображаться при неудачной проверке.
* Шаблоны дочерних классов объединяются со значениями родительских шаблонов во время выполнения. Если ключ совпадает, то значения дочернего класса переопределяют родительские значения
*/
protected static $errorTemplates = [
'CustomInt' => '“{{param}}” должно быть целым числом',
'CustomIntEq' => '“{{param}}” должно равняться {{value}}',
'CustomIntGeLe' => '“{{param}}” должно быть больше или равно {{min}} и меньше или равно {{max}}',
];
/**
* Метод пользовательского валидатора «CustomInt»
*
* @param $value string Проверяемое значение
* @param $reason string|null Сообщение об ошибке в случае неудачи проверки. Если значение равно null, оно генерируется автоматически.
* @param $alias string Псевдоним параметра для использования в сообщении об ошибке.
* @return смешанное Возвращает исходное значение параметра $value
* @throws ValidationException Выбросить исключение при неудаче проверки
*/
public static function validateCustomInt($value, $reason, $alias)
{
$type = gettype($value);
if ($type === 'string') {
if (is_numeric($value) && strpos($value, '.') === false)
return $value;
} elseif ($type === 'integer') {
return $value;
}
if ($reason !== null)
throw new
``` **Текст запроса написан на языке PHP.**
Приведённый текст представляет собой фрагмент кода, в котором описывается класс CustomDemoValidation. Класс содержит методы для проверки значений и генерирования ошибок при несоответствии значений ожидаемым.
Методы проверяют значения типа string и integer на основе различных условий и выдают ошибки с помощью класса ValidationException. В тексте также упоминается о наследовании от другого класса CustomCaseValidation.
В тексте есть описание параметров методов, но нет их использования. Также в тексте присутствует упоминание о том, что параметры методов могут быть проанализированы с использованием пользовательского метода parseParamsOf. Однако сам метод не приводится.
**Перевод текста:**
ValidationException($reason);
$error = self::getErrorTemplate('CustomInt'); $error = str_replace('{{param}}', $alias, $error); throw new ValidationException($error); }
/**
Реализация метода для пользовательского валидатора "CustomIntEq".
Проверяет, равны ли значения $value и $equalVal.
@param $value string значение для проверки
@param $equalVal string сравниваемое значение
@param $reason string|null сообщение об ошибке в случае неудачи. Если null, то сообщение будет сгенерировано автоматически
@param $alias string псевдоним параметра, используемый в сообщении об ошибке
@return mixed возвращает исходное значение параметра $value
@throws ValidationException генерирует исключение в случае неудачной проверки */ public static function validateCustomIntEq($value, $equalVal, $reason, $alias) { $type = gettype($value); if ($type === 'string') { if (is_numeric($value) && strpos($value, '.') === false) { $val = intval($value); if ($val == $equalVal) return $value; $isTypeError = false; } else $isTypeError = true; } elseif ($type === 'integer') { if ($value == $equalVal) return $value; $isTypeError = false; } else $isTypeError = true;
if ($reason !== null) throw new ValidationException($reason);
if ($isTypeError) { $error = self::getErrorTemplate('CustomInt'); $error = str_replace('{{param}}', $alias, $error); } else { $error = self::getErrorTemplate('CustomIntEq'); $error = str_replace('{{param}}', $alias, $error); $error = str_replace('{{value}}', $equalVal, $error); } throw new ValidationException($error); }
/**
Метод для реализации пользовательского валидатора "CustomIntGeLe".
Проверяет, находится ли значение $value в диапазоне [$min, $max].
@param $value string проверяемое значение
@param $min string минимальное значение
@param $max string максимальное значение
@param $reason string|null сообщение об ошибке в случае неудачи. Если null, то сообщение будет сгенерировано автоматически
@param $alias string псевдоним параметра, используемый в сообщении об ошибке
@return mixed возвращает исходное значение параметра $value
@throws ValidationException генерирует исключение в случае неудачной проверки */ public static function validateCustomIntGeLe($value, $min, $max, $reason, $alias) { $type = gettype($value); if ($type === 'string') { if (is_numeric($value) && strpos($value, '.') === false) { $val = intval($value); if ($val >= $min && $val <= $max) return $value; $isTypeError = false; } else $isTypeError = true; } elseif ($type === 'integer') { if ($value >= $min && $value <= $max) return $value; $isTypeError = false; } else $isTypeError = true;
if ($reason !== null) throw new ValidationException($reason);
if ($isTypeError) { $error = self::getErrorTemplate('CustomInt'); $error = str_replace('{{param}}', $alias, $error); } else { $error = self::getErrorTemplate('CustomIntGeLe'); $error = str_replace('{{param}}', $alias, $error); $error = str_replace('{{min}}', $min, $error); $error = str_replace('{{max}}', $max, $error); } throw new ValidationException($error); } }
| **IntGtLt** | IntGtLt:1,100 | «парам.» должен быть больше 1 и меньше 100. |
| **IntGeLe** | IntGeLe:1,100 | «парам.» должен быть больше или равен 1 и меньше или равен 100. |
| **IntGtLe** | IntGtLe:1,100 | «парам.» должен быть больше 1 и меньше или равен 100. |
| **IntGeLt** | IntGeLt:1,100 | «парам.» должен быть больше или равен 1 и меньше 100. |
| **IntIn** | IntIn:2,3,5,7,11 | «парам.» может принимать только значения: 2, 3, 5, 7, 11. |
| **IntNotIn** | IntNotIn:2,3,5,7,11 | «парам.» не может принимать значения: 2, 3, 5, 7, 11.|
### A.2 **Вещественный тип**
Внутри всегда используется double для обработки.
| Вещественный тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| Float | Float | «парам.» должно быть вещественным числом. |
| FloatGt | FloatGt:1.0 | «парам.» должно быть больше 1. |
| FloatGe | FloatGe:1.0 | «парам.» должно быть больше или равно 1. |
| FloatLt | FloatLt:1.0 | «парам.» должно быть меньше 1. |
| FloatLe | FloatLe:1.0 | «парам.» должно быть меньше или равно 1. |
| FloatGtLt | FloatGtLt:0,1.0 | «парам.» должно быть больше 0 и меньше 1. |
| FloatGeLe | FloatGeLe:0,1.0 | «парам.» должно быть больше или равно 0 и меньше или равно 1. |
| FloatGtLe | FloatGtLe:0,1.0 | «парам.» должно быть больше 0 и меньше или равно 1. |
| FloatGeLt | FloatGeLt:0,1.0 | «парам.» должно быть больше или равно 0 и меньше 1.|
### A.3 **Логический тип**
| Логический тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| Bool | Bool | Допустимые значения: true, false, «true» (без учёта регистра). |
| BoolTrue | BoolTrue | Допустимое значение: true или «true». |
| BoolFalse | BoolFalse | Допустимое значение: false или «false». |
| BoolSmart | BoolSmart | Допустимые значения: true, false, «true», «false», 1, 0, «1», «0», «yes», «no», «y», «n» (без учёта регистра). |
| BoolSmartTrue | BoolSmartTrue | Допустимые значения: true, «true», 1, «1», «yes», «y» (без учёта регистра). |
| BoolSmartFalse | BoolSmartFalse | Допустимые значения: false, «false», 0, «0», «no», «n» (без учёта регистра).|
### A.4 **Строковый тип**
| Строковый тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| Str | Str | «парам.» должна быть строкой. |
| StrEq | StrEq:abc | «парам.» должна равняться «abc». |
| StrEqI | StrEqI:abc | «парам.» должна равняться «abc» (без учёта регистра). |
| StrNe | StrNe:abc | «парам.» не должна равняться «abc». |
| StrNeI | StrNeI:abc | «парам.» не должна равняться «abc» (без учёта регистра). |
| StrIn | StrIn:abc,def,g | «парам.» может иметь только следующие значения: abc, def, g. |
| StrInI | StrInI:abc,def,g | «парам.» может иметь только следующие значения: abc, def, g (без учёта регистра). |
| StrNotIn | StrNotIn:abc,def,g | «парам.» не может иметь значений: abc, def, g. |
| StrNotInI | StrNotInI:abc,def,g | «парам.» не может иметь следующих значений: abc, def, g (без учёта регистра). |
| StrLen | StrLen:8 | Длина «парам.» должна равняться 8. |
| StrLenGe | StrLenGe:8 | Длина «парам.» должна быть больше или равна 8. |
| StrLenLe | StrLenLe:8 | Длина «парам.» должна быть меньше или равна 8. |
| StrLenGeLe | StrLenGeLe:6,8 | Длина «парам.» должна находиться в диапазоне от 6 до 8 включительно. |
| ByteLen | ByteLen:8 | Количество байт в «парам.» должно равняться 8. |
| ByteLenGe | ByteLenGe:8 | Количество байт в «парам.» должно быть больше или равняться 8. |
| ByteLenLe | ByteLenLe:8 | Количество байт в «парам.» должно быть меньше или равняться 8. |
| ByteLenGeLe | ByteLenGeLe:6,8 | Количество байт в «парам.» должно находиться в диапазоне от 6 до 8 включительно.|
| Letters | Letters | В «парам.» могут быть только буквы. |
| Alphabet | Alphabet | То же, что и Letters. |
| Numbers | Numbers | «парам.» должны быть только цифры. |
| Digits | Digits | То же, что и Numbers. |
| LettersNumbers | LettersNumbers | В «парам.» могут быть буквы и цифры. |
| Numeric | Numeric | «парам.» должно быть числовым значением. Обычно используется для работы с большими числами (больше диапазона double), которые обычно представляются в виде строк. Если это число в нормальном диапазоне, можно использовать Int или Float для проверки. |
| VarName | VarName | В «парам.» могут быть только буквы, цифры и подчёркивания, и он должен начинаться с буквы или подчёркивания. |
| Email | Email | «парам.» должен быть действительным адресом электронной почты. |
| Url | Url | «парам.» должен быть допустимым URL-адресом. |
| Ip | Ip | «парам.» должен быть корректным IP-адресом. |
| Mac | Mac | «парам.» должен быть правильным MAC-адресом. |
| Regexp | Regexp:/^abc$/ | Проверка соответствия регулярному выражению Perl. |
### A.5 **Массивный тип**
| Массивный тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| Arr | Arr | «парам.» должен быть массивом. |
| ArrLen | ArrLen:5 | Длина массива «парам.» должна равняться 5. |
| ArrLenGe | ArrLenGe:1 | Длина массива «парам.» должна быть больше или равной 1. |
| ArrLenLe | ArrLenLe:9 | Длина массива «парам.» должна быть меньше или равной 9. |
| ArrLenGeLe | ArrLenGeLe:1,9 | Длина массива «парам.» должна находиться в диапазоне от 1 до 9 включительно. |
### A.6 **Объектный тип**
| Объектный тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| Obj | Obj | «парам.» должен быть объектом. |
### A.7 **Файловый тип**
| Файловый тип верификатора | Пример | Описание |
| :------| :------ | :------ |
| File | File | «парам.» должен быть файлом. |
| FileMaxSize | FileMaxSize:10mb | «парам.» должен быть файлом, размер которого не превышает 10 МБ. |
| FileMinSize | FileMinSize:100kb | «парам.» должен быть файлом, размер которого больше или равен 100 КБ. |
| FileImage | FileImage | «парам.» должен быть изображением. |
| FileVideo | FileVideo | «парам.» должен быть видеофайлом. | | Тип данных и проверка | Пример | Описание |
| :------| :------ | :------ |
| FileAudio | FileAudio | «{{param}}» должен быть аудиофайлом |
| FileMimes | FileMimes:mpeg,jpeg,png | «{{param}}» должен иметь MIME-тип из списка:{{mimes}} |
### A.8 Проверка даты и времени
| Проверка даты и времени | Пример | Описание |
| :------| :------ | :------ |
| Date | Date | «{{param}}» должно соответствовать формату даты YYYY-MM-DD |
| DateFrom | DateFrom:2017-04-13 | «{{param}}}» не может быть раньше {{from}} |
| DateTo | DateTo:2017-04-13 | «{{param}}}» не может быть позже {{to}} |
| DateFromTo | DateFromTo:2017-04-13,2017-04-13 | «{{param}}}» должно быть в диапазоне от {{from}} до {{to}} включительно |
| DateTime | DateTime | «{{param}}» должно соответствовать формату дата-время YYYY-MM-DD HH:mm:ss |
| DateTimeFrom | DateTimeFrom:2017-04-13 12:00:00 | «{{param}}}» не может быть раньше {{from}} |
| DateTimeTo | DateTimeTo:2017-04-13 12:00:00 | «{{param}}}» должно быть раньше {{to}} |
| DateTimeFromTo | DateTimeFromTo:2017-04-13 12:00:00,2017-04-13 12:00:00 | «{{param}}}» должно находиться в диапазоне от {{from}} до {{to}} включительно |
### А.9 Логические проверки
В одном правиле логической проверки условие должно стоять перед другими проверками, и можно использовать несколько условий подряд.
Обратите внимание, что в условиях обычно проверяется **значение другого параметра**, а значение текущего параметра проверяется последующими проверками.
| Логическая проверка | Пример | Описание |
| :------| :------ | :------ |
| If| If:selected | Если параметр «selected» равен 1, true, '1', 'true', 'yes' или 'y' (строка без учёта регистра) |
| IfNot| IfNot:selected | Если параметр «selected» равен 0, false, '0', 'false', 'no' или'n' (строка без учёта регистра) |
| IfTrue| IfTrue:selected | Если параметр «selected» равен true или 'true' (без учёта регистра) |
| IfFalse| IfFalse:selected | Если параметр «selected» равен false или 'false' (без учёта регистра) |
| IfExist| IfExist:var | Если существует параметр «var» |
| IfNotExist| IfNotExist:var | Если не существует параметр «var» |
| IfIntEq| IfIntEq:var,1 | if (var === 1) |
| IfIntNe| IfIntNe:var,2 | if (var !== 2). Обратите внимание, что если тип данных условия var не соответствует типу данных, то условие считается выполненным; для остальных проверок IfIntXx, если тип данных не совпадает, условие не выполняется |
| IfIntGt| IfIntGt:var,0 | if (var > 0) |
| IfIntLt| IfIntLt:var,1 | if (var < 0) |
| IfIntGe| IfIntGe:var,6 | if (var >= 6) |
| IfIntLe| IfIntLe:var,8 | if (var <= 8) |
| IfIntIn| IfIntIn:var,2,3,5,7 | if (in_array(var, \[2,3,5,7])) |
| IfIntNotIn| IfIntNotIn:var,2,3,5,7 | if (!in_array(var, \[2,3,5,7])) |
| IfStrEq| IfStrEq:var,waiting | if (var === 'waiting') |
| IfStrNe| IfStrNe:var,editing | if (var !== 'editing'). Обратите внимание, что если тип данных условия var не соответствует типу данных, то условие считается выполненным; для остальных проверок IfStrXx, если тип данных не совпадает, условие не выполняется |
| IfStrGt| IfStrGt:var,a | if (var > 'a') |
| IfStrLt| IfStrLt:var,z | if (var < 'z') |
| IfStrGe| IfStrGe:var,A | if (var >= 'A') |
| IfStrLe| IfStrLe:var,Z | if (var <= 'Z') |
| IfStrIn| IfStrIn:var,normal,warning,error | if (in_array(var, \['normal', 'warning', 'error'], true)) |
| IfStrNotIn| IfStrNotIn:var,warning,error | if (!in_array(var, \['warning', 'error'], true)) |
### А.10 Другие проверки
| Другие проверки | Пример | Описание |
| :------| :------ | :------ |
| Required | Required | Обязательный параметр. Если используется вместе с другими проверками кроме логических, должен быть первым |
| Alias | Alias:параметр | Пользовательское сообщение об ошибке с именем параметра (можно выбрать только одну из проверок Alias или \>>>, должна быть последней) |
| \>>> | \>>>:это пользовательское сообщение | Пользовательское сообщение об ошибке (можно выбрать только одну из проверок Alias или \>>>, должна быть последней) |
| Пользовательская функция PHP | function() {} | Не поддерживается, так как если вы столкнётесь со сложной проверкой параметров, которую инструмент не поддерживает, вы можете написать код на PHP напрямую, без использования инструмента (иначе это будет излишним усложнением) |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )