1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/photondragon-webgeeker-validation

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
readme.md

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 Особенности инструмента:

  • Каждый функциональный компонент имеет модульное тестирование (всего 44 теста, более 700 утверждений).
  • Поддерживает проверку бесконечных вложенных структур данных (см. пример в разделе 1.3).
  • Позволяет проводить условную проверку, применяя разные правила проверки в зависимости от значения параметра (см. пример в разделе 1.3).
  • Обеспечивает поддержку регулярных выражений для проверки.
  • Простой и понятный синтаксис проверки.
  • Лёгкий вес, не требует определения и обслуживания различных классов проверки.
  • Проверка данных семантически ясна, нет проблемы «одного слова — много значений».
  • Легко изучать и запоминать. Например, все целочисленные проверки начинаются с «Int», а проверки с плавающей точкой начинаются с «Float». Исключением являются строковые проверки, которые могут начинаться как с «Str», так и с других префиксов, таких как «Regexp», «Ip», «Email» и «Url».
  • Не привязан ни к одной структуре, не имеет зависимостей. Инструмент можно использовать в любой структуре или без неё.
  • Поддержка пользовательских проверок позволяет реализовать различные функции проверки.

Пример простой проверки

Этот пример демонстрирует проверку параметров запроса на получение списка жалоб пользователей (обратите внимание на условные проверки и проверки вложенных структур):

// Правила проверки
$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 Проверка логических параметров

Логические проверки:

  • Bool: допустимые значения: true, false, "true", "false" (строки игнорируют регистр).
  • BoolTrue: допустимые значения: true, "true" (строки игнорируют регистр).
  • BoolFalse: допустимые значения: false, "false" (строки игнорируют регистр).
  • BoolSmart: допустимые значения: true, false, "true", "false", 1, 0, "1", "0", "yes", "no", "y", "n" (строки игнорируют регистр)
  • BoolSmartTrue: допустимые значения: true, "true", 1, "1", "yes", "y" (строки игнорируют регистр)
  • BoolSmartFalse: допустимые значения: 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 мегабайт.

4.7 Валидатор Required

  • Валидатор Required требует, чтобы параметр существовал и его значение не было равно null (это значение null в PHP, а не строка «null»), иначе считается, что параметра нет.
  • Если несколько валидаторов соединены вместе, Required должен стоять перед другими валидаторами.
  • Если есть условный валидатор, Required должен быть соединён после него.
  • Если в правиле валидации нет Required, то проверка происходит только при наличии параметра, и если она не проходит, генерируется исключение; если параметра нет, проверка не производится (считается пройденной).

Пример:

"size" => "Required|StrIn:small,middle,large"

Эта проверка требует, чтобы параметр «size» был строкой «small», «middle» или «large».

4.8 Игнорирование всех валидаторов Required

Например, при создании пользователя необходимо предоставить все данные, но при обновлении информации о пользователе не обязательно предоставлять все данные — достаточно обновить те, которые были предоставлены.

$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.

Таким образом, мы можем использовать один набор правил для создания и обновления информации о пользователях.

4.9 Проверка вложенных параметров

Следующий пример показывает проверку вложенных массивов и объектов:

$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);

4.10 Условные валидаторы

Условные валидаторы начинаются с «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 для получения более подробной информации.

4.15 Интернационализация

Начиная с версии 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",
        ],
    ];
}

Обратите внимание:

  • Коды языков чувствительны к регистру, рекомендуется использовать строчные буквы, например, «zh-cn», «en-us».
  • Названия кодов языков могут быть любыми, но рекомендуется использовать стандартные коды языков.

Используйте этот класс MyValidation для проверки, чтобы реализовать перевод текста.

MyValidation::setLangCode("zh-tw"); // Устанавливаем код языка

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // Нет Alias или >>>, только перевод шаблона сообщения об ошибке (соответствует строке 🌝)
]); // Выбрасывает ошибку: «var» должен быть целым числом

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:变量", // Есть Alias, кроме перевода шаблона сообщения об ошибке, также переводит имя параметра (соответствует строке 🌙)
]); //

Если указан неправильный код языка или перевод не найден, перевод не выполняется, и выводится исходный текст.

4.16 Интернационализация (до версии 0.4)

(Если вы используете версию 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",
        ],
    ];
}

Обратите внимание:

  • Коды языков чувствительны к регистру, рекомендуется использовать строчные буквы, например, «zh-cn», «en-us».
  • Названия кодов языков могут быть любыми, но рекомендуется использовать стандартные коды языков.

Этот класс MyValidation используется для проверки и реализации перевода текста.

MyValidation::setLangCode("zh-tw"); // Устанавливаем код языка

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // Нет Alias или >>>, только перевод шаблона сообщения об ошибке (соответствует строке 🌝)
]); // Выбрасывает ошибку: «var» должен быть целым числом

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:变量", // Есть Alias, кроме перевода шаблона сообщения об ошибке, также переводится имя параметра (соответствует строке 🌙)
]); // Будет выдано исключение: «Переменная» должна быть целым числом.

Если предоставлен некорректный код языка, либо не найден перевод текста, то он не переводится и выводится исходный текст.

4.17 Пользовательский валидатор

Здесь следует подчеркнуть, что не следует злоупотреблять функцией пользовательского валидатора. Если связанная с бизнесом проверка используется редко, можно рассмотреть возможность её непосредственной реализации на PHP или создания PHP-функции для прямого вызова, а не включения в систему проверки webgeeker-validation.

4.17.1 Пример простого пользовательского валидатора

В следующем примере определяется класс 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'

4.17.2 Как реализовать пользовательский валидатор

  1. Пользовательские валидаторы должны начинаться с Custom, например, «CustomAbc», «CustomXyz».
  2. Определите класс, наследующий от \WebGeeker\Validation\Validation.
  3. В этом классе предоставьте «метод реализации пользовательского валидатора», для каждого валидатора требуется отдельный метод.
  4. Шаблон сообщений об ошибках $errorTemplates в классе является необязательным, поскольку вы можете напрямую генерировать текст сообщения об ошибке в методе реализации (но тогда функция интернационализации будет недоступна).

4.17.3 Требования к методу реализации пользовательских валидаторов

  1. Метод должен начинаться со слова «validate», за которым следует название валидатора. Например, «validateCustomStartWith».
  2. Если у пользовательского валидатора нет параметров, формат метода следующий:
    public static function validateCustomAbc($value, $reason, $alias) {}
    Метод имеет 3 параметра:
    • $value — значение для проверки.
    • $reason — сообщение об ошибке в случае неудачной проверки. Его значение — это строка, предоставленная псевдовалидатором >>>.
    • $alias — псевдоним параметра, который используется в сообщении об ошибке. Его значение равно строке, предоставленной псевдовалидатором Alias.
  3. Если пользовательский валидатор имеет n параметров, то его метод проверки должен иметь 3 + n параметра, дополнительные n параметры должны следовать после параметра $value.
    Пример валидатора с одним параметром: "CustomStartWith:head".
    Пример валидатора с несколькими параметрами: "CustomStrIn:started,success,failed", где несколько параметров разделены запятыми.
  4. Если проверка пройдена успешно, метод должен вернуть исходное значение параметра $value.
  5. Если проверка не удалась, должно быть выброшено исключение.

Далее представлен ещё один пример класса 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 )

Вы можете оставить комментарий после Вход в систему

Введение

WebGeeker-Validation: мощный инструмент для проверки параметров (PHP). Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/photondragon-webgeeker-validation.git
git@api.gitlife.ru:oschina-mirror/photondragon-webgeeker-validation.git
oschina-mirror
photondragon-webgeeker-validation
photondragon-webgeeker-validation
master