Маленькая, но мощная библиотека валидации и фильтрации данных на PHP.- Простая и удобная, поддерживает добавление пользовательских валидаторов
yii
, laravel
, Respect/Validation
Inhere\Validate\Filter\Filtration
, который можно использовать отдельно для фильтрации данных## Два способа конфигурирования правилvalidate поддерживает два способа конфигурирования правил, что соответствует двум стратегиям сбора и анализа правил.
Validation|RuleValidation
: Каждое правило может содержать несколько полей, но только один валидатор. (Настройка правил аналогична Yii)Пример конфигурирования:
[
['tagId,userId,name,email,freeTime', 'required', ...],
// ... ...
];
FieldValidation
: в каждом правиле допускается только одно поле, но можно использовать несколько валидаторов. (конфигурация правил аналогична Laravel)Пример конфигурации:
[
['field', 'required|string:5,10|...', ...],
// ... ...
]
Для более подробных примеров конфигурации см. Настройка как в Laravel
Обратите внимание: Ветка
master
требуетphp7.1+
(рекомендовано использование). Ветка1.x
поддерживает версию PHP 5, но практически не поддерживается.
composer require inhere/php-validate
# composer require inhere/php-validate ^2.2
Validation
Для быстрого и простого использования валидации используйте класс Inhere\Validate\Validation
.
use Inhere\Validate\Validation;
class SomeController
{
public function demoAction()
{
$v = Validation::check($_POST, [
// добавление правила
['title', 'min', 40],
['freeTime', 'number'],
]);
}
}
``` // 4 <= tagId <= 567
['tagId', 'size', 'min' => 4, 'max' => 567, 'filter' => 'int'],
// Длина заголовка >= 40. Обратите внимание, что требуется только один параметр проверки, ключ добавлять не нужно, как в данном случае с 40
['title', 'min', 40, 'filter' => 'trim'],```php
// Больше нуля
['freeTime', 'number'],
// Содержит условие
['tagId', 'number', 'when' => function($data) {
return isset($data['status']) && $data['status'] > 2;
}],
// Перед проверкой будет преобразовано в int. И правило будет действовать только при указании сцены 'scene1'
['userId', 'number', 'on' => 'scene1', 'filter' => 'int'],
['username', 'string', 'on' => 'scene2', 'filter' => 'trim'],
// Использует пользовательское регулярное выражение
['username', 'regexp', '/^[a-z]\w{2,12}$/'],
// Использует пользовательский валидатор и указывает сообщение текущего правила
['title', 'custom', 'msg' => '{attr} сообщение ошибки!'],
// Прямое использование замыкания для проверки
['status', function($status) {
if (is_int($status) && $status > 3) {
return true;
}
return false;
}],
// Отмечает поле как безопасное и надежное, поэтому нет необходимости в проверке
['createdAt, updatedAt', 'safe'],
];
}
// Определяет поля, требующие проверки в различных сценариях.
// Функционал аналогичен правилу 'on', но лучше использовать одно из них, чтобы избежать путаницы.
public function scenarios(): array
{
return [
'create' => ['user', 'pwd', 'code'],
'update' => ['user', 'pwd'],
];
}
// Определяет переводы полей
public function translates(): array
{
return [
'userId' => 'Идентификатор пользователя',
];
}
``` // Specifies custom messages for validators. By default, use {@see ErrorMessageTrait::$messages}.
public function messages(): array
{
return [
// Uses the validator name to specify the message
'required' => '{attr} является обязательным.',
// You can also specify messages for specific field rules
'title.required' => 'О, заголовок является обязательным. вы знакомы с этим?',
];
} // Добавляет пользовательский валидатор. Он должен вернуть булево значение, указывающее на успешность или провал проверки
protected function customValidator($title): bool
{
// some logic...
// $this->getRaw('field'); доступ к данным
}
``` return true; // или false;
}
}
// Валидация данных POST
$v = PageRequest::check($_POST);
// Валидация не удалась
if ($v->isFail()) {
var_dump($v->getErrors());
var_dump($v->firstError());
}
// Валидация удалась...
$secureData = $v->getSafeData(); // безопасные данные после успешной валидации
// $postData = $v->all(); // исходные данные
$db->save($secureData);
ValidationTrait
Создайте новый класс и используйте Trait InHere\Validate\ValidationTrait
.
Этот способ предназначен для продвинутой настройки и может легко быть внедрен в другие классы.
Например, внедрите его в класс модели данных, чтобы реализовать базовый класс модели с автоматической проверкой перед добавлением записи в базу данных:
class DataModel
{
use \InHere\Validate\ValidationTrait;
protected $data = [];
protected $db;
/**
* @param array $data
* @return $this
*/
public function load(array $data)
{
$this->data = $data;
return $this;
}
public function create()
{
if ($this->validate()->isFail()) {
return false;
}
return $this->db->insert($this->getSafeData());
}
}
Использование:```php // в классе модели class UserModel extends DataModel { public function rules(): array { return [ ['username, passwd', 'required'], ['passwd', 'compare', 'repasswd', 'on' => 'create'], ['username', 'string', 'min' => 2, 'max' => 20, 'on' => 'create'], ['id', 'integer', 'on' => 'update'], // действует только при сценарии update ['createdAt, updatedAt', 'safe'], ]; } }
class UserController
{
// в действии
// @api /user/add
public function addAction()
{
$model = new UserModel;
// Загрузка отправленных данных и установка сцены как: create
$model->load($_POST)->atScene('create');
if (!$ret = $model->create()) {
exit($model->firstError());
}
echo "Добавление успешно: userId = $ret";
}
}
Основной вызов валидатора поддерживает:
Inhere\Validate\Validation
, добавьте методы валидации. См. выше способ использования 1
Validation->addValidator()
Validator\UserValidators::set
Validator\ValidatorInterface
__invoke
)>Внимание: методы валидаторов, определенные внутри текущего класса, должны иметь суффикс Validator
, чтобы избежать конфликтов с другими методами.
$v = Validation::make($_POST, [
// добавляем правило
['title', 'min', 40],
['freeTime', 'number'],
['title', 'checkTitle'],
])
->addValidator('checkTitle', function ($title) { // Первый аргумент — это значение поля. Последний аргумент всегда равен $data
// логика...
return true; // Успешный выход — вернуть True. При провале проверки — вернуть False.
}, '{attr} сообщение по умолчанию!')
->validate();
```Прямое использование замыканий для валидации, например:
```php
['status', function($status) { // Первый аргумент — это значение поля. Последний аргумент всегда равен $data
if ($status > 3) {
return true;
}
return false;
}]
Определите класс-валидатор с использованием замыкания для повышения повторного использования методов валидации
Не забудьте расширять
\Inhere\Validate\Validator\AbstractValidator
и реализовать обязательные методыvalidate
class AdemoValidator extends \Inhere\Validate\Validator\AbstractValidator
{
public function validate($value, $data): bool
{
if ($value === 1) {
return true;
}
return false;
}
}
// Использование
['status', new AdemoValidator()],
Validation
Этот метод конфликтует с
onBeforeValidate
&onAfterValidate
use Inhere\Validate\Validation;
class PageValidation extends Validation
{
# Обработка перед выполнением валидации, возвращаемое значение false приведет к прекращению валидации, но ошибочные данные отсутствуют, можно использовать addError для добавления ошибочных данных
public function beforeValidate(): bool
{
return true;
}
# Обработка после выполнения валидации, делайте что хотите
public function afterValidate(): bool
{
return true;
}
}
onBeforeValidate
& onAfterValidate
use Inhere\Validate\Validation;
$v = Validation::make(['name' => 'inhere'], [
['name', 'string', 'min' => 3, 'filter' => 'trim|upper']
]);
$v->onBeforeValidate(function (Validation $v) {
return true;
});
``````md
## Полный пример правил
Полный пример правил, содержащий все возможные элементы.**Обратите внимание:**
- Каждое правило должно иметь первый элемент **обязательно**, который является _проверяемым полем_ (может быть массивом нескольких полей. тип: `строка | массив`)
- Второй элемент **обязательно** должен быть валидатором (строка, замыкание, вызываемый объект или массив. тип: `строка | замыкание | callable`)
- Далее следуют параметры, необходимые для валидатора (если валидатор требует одного параметра, ключ не требуется)
- Затем следует конфигурация других опций (`msg`, `on`, `фильтр`, ...)
```php
// полное правило
[
// базовая конфигурация валидации
'field0,field1,...', 'валидатор', 'арг0', 'арг1', ...,
// некоторые расширенные опции
'skipOnEmpty' => 'логическое значение',
'msg' => 'строка | массив',
'поумолчанию' => 'любой тип данных',
'on' => 'строка | массив',
'isEmpty' => 'функциональность(string|замыкание)',
'when' => 'функциональность(string|замыкание)',
'фильтр' => 'функциональность(string|array|замыкание)'
]
Конфигурация валидатора поля
FieldValidation
аналогична, но имеет только одно поле, а валидатор может иметь несколько
Кроме возможности добавления проверок полей, есть также специальные ключевые слова, которые можно использовать для различных потребностей.
```### поумолчанию
— Установка значения по умолчанию
Устанавливает значение по умолчанию для одного или нескольких полей.
['page', 'число', 'поумолчанию' => 1],
['pageSize', 'число', 'поумолчанию' => 15],
Внимание: Значение по умолчанию также будет проверяться валидаторами
msg
— Установка сообщения об ошибкеУстанавливает сообщение об ошибке для текущего правила, после чего будут использоваться пользовательские сообщения вместо стандартных.
['title', 'customValidator', 'msg' => '{attr} сообщение об ошибке!'], // Указывает сообщение для текущего правила
// или это может быть массивом!
['tagId,title,userId,freeTime', 'required', 'msg' => [
'tagId' => 'сообщение...',
'userId' => 'сообщение 1...',
]],
on
— Установка сценария использования правилаЕсли вам нужно, чтобы определённые правила применялись в разных ситуациях, вы можете установить сценарий использования правила. При выполнении валидации указывается сценарий, который должен применяться.
// В классе, наследующем Validation...
public function rules(): array
{
return [
['title', 'required'],
['userId', 'число', 'on' => 'create'],
['userId', 'целое число', 'on' => 'update'],
['name', 'строка', 'on' => 'create,update'],
];
}
Использование: Когда в следующем примере указано проверочное сценарий, будут использоваться правила 1, 3 и 4 выше.
// ...
$valid = ValidationClass::make($_POST)->atScene('обновление')->validate();
// ...
```### `when` -- Условие применения правила
> Правило будет применяться только если выполнено условие (`when`).
Например, при проверке второго правила, сначала выполняется замыкание (`when`),
и если оно возвращает `true`, правило проверяется; в противном случае проверка пропускается.
```php
// В подклассах, расширяющих Validation...
public function rules(): array
{
return [
['title', 'required'],
['tagId', 'число', 'when' => function($data) {
return isset($data['статус']) && $data['статус'] > 2;
}],
];
}
skipOnEmpty
-- Пропустить проверку при пустом значенииПропускать ли проверку, когда значение поля пустое? По умолчанию это true
.
Правило
required*
не подпадает под это ограничение.
Например, есть такое правило:
['имя', 'строка']
Если в отправленных данных нет поля имя
или значение $data['имя']
равно пустому,
то проверка на соответствие типу строка
не производится;
только тогда, когда поле $data['имя']
не пустое, происходит проверка.
Чтобы проверять даже при пустых значениях, добавьте это поле также в правило required
.
['имя', 'required']
['имя', 'строка']
Или можно установить 'skipOnEmpty' => false
:
['имя', 'строка', 'skipOnEmpty' => false]
Как определяются пустые значения О пустых значениях
isEmpty
-- Определение пустотыПроверяет, является ли значение пустым, что используется как основание для skipOnEmpty
.
По умолчанию используется метод Validators::isEmpty
.Вы можете также указать своё условие:
['имя', 'строка', 'isEmpty' => function($value) {
return true или false;
}]
При создании своего условия isEmpty
, обратите внимание на то, является ли $value
экземпляром ArrayValueNotExists
.
['пользователи.*.id', 'каждый', 'обязательно', 'isEmpty' => function($value) {
if ($value instanceof \InHere\Validate\ArrayValueNotExists) {
return true;
}
// ваш код здесь ...
}]
filter
-- Использование фильтровПоддерживает использование фильтра для очистки значений перед проверкой встроенные фильтры
['tagId, userId, freeTime', 'число', 'filter' => 'int'],
['field', 'валидатор', 'filter' => 'filter0|filter1...'],
// При необходимости можно использовать более специфичные массивы.
['field1', 'валидатор', 'filter' => [
'строка',
'trim',
['Класс', 'метод'],
['Объект', 'метод'],
// Добавление дополнительных аргументов. Первый аргумент всегда является значением поля для фильтрации, остальные добавляются последовательно
'myFilter' => ['арг1', 'арг2'],
// Прямое использование замыканий
function($val) {
return str_replace(' ', '', $val);
},
]],
Подсказка:- Разрешено одновременное использование нескольких фильтров. Строки разделены символом |
, либо конфигурируются в виде массива.
Filter
, чтобы избежать конфликтов с другими методами.Filtration
можно использовать функционал фильтрации независимо.Если требуется повторное использование определённых правил в различных ситуациях, можно указать сценарий использования этих правил. При выполнении проверки также следует указывать проверяемый сценарий.
Используйте метод scenarios()
в производном классе:
// В производном классе ValidationClass...
// Определите поля, требующие проверки для разных сценариев.
// Функциональность аналогична ключу 'on' в правилах, рекомендуется не использовать вместе, чтобы избежать путаницы.
public function scenarios(): array
{
return [
'create' => ['user', 'pwd', 'code'],
'update' => ['user', 'pwd'],
];
}
Укажите опцию on
при добавлении правил:
// В производном классе ValidationClass...
public function rules(): array
{
return [
['title', 'required' ],
['userId', 'number', 'on' => 'create' ],
['userId', 'integer', 'on' => 'update' ],
['name', 'string', 'on' => 'create,update' ],
];
}
$v->setScene('update')->validate();
trim
, ucfirst
, json_decode
, md5
.--------|----------|--------
`abs` | Возвращает абсолютное значение | `['field', 'int', 'filter' => 'abs'],`
`int` | Удаляет недопустимые символы и преобразует в тип `int`. Поддерживает массивы | `['userId', 'number', 'filter' => 'int'],`
`bool` | Преобразует в тип `bool` [о булевых значениях](#about-bool-value) | `['agree', 'bool']`
`float` | Удаляет недопустимые символы и сохраняет данные в формате `float` | `['price', 'float', 'filter' => 'float'],`
`string`| Удаляет недопустимые символы и преобразует в тип `string` | `['userId', 'number', 'filter' => 'string'],`
`trim` | Удаляет пробелы с начала и конца строки. Поддерживает массивы | `['username', 'min', 4, 'filter' => 'trim'],`
`nl2br` | Преобразует `\n`, `\r\n`, `\r` в `<br/>` | `['content', 'string', 'filter' => 'nl2br'],`
`lower` | Преобразует строку в нижний регистр | `['description', 'string', 'filter' => 'lowercase'],`
`upper` | Преобразует строку в верхний регистр | `['title', 'string', 'filter' => 'uppercase'],`
`snake` | Преобразует строку в стиль snake_case | `['title', 'string', 'filter' => 'snakeCase'],`
`camel` | Преобразует строку в стиль camelCase | `['title', 'string', 'filter' => 'camelCase'],`
`timestamp` | Преобразует строку с датой в timestamp | `['publishedAt', 'number', 'filter' => 'strToTime'],`
`url` | Фильтрация URL, удаляет все недопустимые символы | `['field', 'url', 'filter' => 'url'],`
`str2list` | Преобразование строки в массив `'tag0,tag1' -> ['tag0', 'tag1']` | `['tags', 'strList', 'filter' => 'str2array'],`
`unique` | Удаление повторяющихся значений в массиве (через `array_unique()`) | `['tagIds', 'intList', 'filter' => 'unique'],`
````email` | Фильтрация email, удаляет все недопустимые символы | `['field', 'email', 'filter' => 'email'],`
`encoded` | Удаление ненужных символов после URL-кодирования, аналогично функции `urlencode()` | `['imgUrl', 'url', 'filter' => 'encoded'],`
`clearSpace` | Удаление пробелов | `['title', 'string', 'filter' => 'clearSpace'],`
`clearNewline` | Удаление символов новой строки | `['title', 'string', 'filter' => 'clearNewline'],`
`clearTags/stripTags` | Аналогичен использованию `strip_tags()` | `['content', 'string', 'filter' => 'clearTags'],`
`escape/specialChars` | Аналогичен использованию `htmlspecialchars()` для экранирования данных | `['content', 'string', 'filter' => 'specialChars'],`
`quotes` | Использует `addslashes()` для экранирования данных | `['content', 'string', 'filter' => 'quotes'],`<a name="built-in-validators"></a>## Встроенные валидаторы> Валидаторы, разделённые символами `/`, имеют одинаковые функции, но используются под различными именами. Aliases Проверка данных | Описание | Пример правил
----------------|----------|--------------
`required` | Обязательность поля/свойства (не может быть пустым). [О пустых значениях](#о-пустых-значениях) | `['tagId, userId', 'required' ]`
`int/integer` | Проверяет, является ли значение целым числом. Поддерживает проверку диапазона значений. | `['userId', 'int']` `['userId', 'int', 'min'=>4, 'max'=>16]`
`num/number` | Проверяет, является ли значение положительным числом. Поддерживает проверку диапазона значений. | `['userId', 'number']` `['userId', 'number', 'min'=>4, 'max'=>16]`
`bool/boolean` | Проверяет, является ли значение логическим типом. [О логических значениях](#о-логических-значениях) | `['open', 'bool']`
`float` | Проверяет, является ли значение числом с плавающей запятой. | `['price', 'float']`
`string` | Проверяет, является ли значение строкой. Поддерживает проверку длины строки. | `['name', 'string']`, `['name', 'string', 'min'=>4, `max`=16]`
`accepted` | Поле должно иметь значение `yes/on/1/true`. Это полезно при проверке согласия с условиями использования (см. Laravel). | `['agree', 'accepted']`
`url` | Проверяет, является ли значение валидной ссылкой. | `['myUrl', 'url']`
`email` | Проверяет, является ли значение валидным адресом электронной почты. | `['userEmail', 'email']`
`alpha` | Проверяет, состоит ли значение только из букв. | `['name', 'alpha']`
`alphaNum` | Проверяет, состоит ли значение только из букв и цифр. | `['field', 'alphaNum']````markdown
`alphaDash` | Проверяет, состоит ли значение только из букв, цифр, дефисов (-) и нижних подчеркиваний (_). | `['field', 'alphaDash']`
`map/isMap` | Проверяет, является ли значение ассоциативным массивом (ключ-значение). | `['goods', 'isMap']`
`list/isList` | Проверяет, является ли значение последовательным массивом (ключи начинаются с нуля и увеличиваются). | `['tags', 'isList']`
`array/isArray` | Проверяет, является ли значение массивом. | `['goods', 'isArray']`
`each` | Применяет указанный валидатор ко всем элементам массива и требует, чтобы все они прошли проверку. | `['goods.*','each','string']`, `['goods.*','each','string','min'=>3]`
`hasKey` | Проверяет наличие ключей в массиве. | `['goods', 'hasKey', 'pear']`, `['goods', 'hasKey', ['pear', 'banana']]`
`distinct` | Все значения в массиве должны быть уникальными. | `['goods', 'distinct']`, `['users.*.id', 'distinct']`
`ints/intList` | Проверяет, что значение представляет собой список целых чисел. | `['tagIds', 'intList']`
`numList` | Проверяет, что значение представляет собой список чисел. | `['tagIds', 'numList']`
`strings/strList`| Проверяет, что значение представляет собой список строк. | `['tags', 'strList']`
`arrList` | Проверяет, что значение представляет собой список массивов (мульти-массивы). | `['tags', 'arrList']`
`min` | Проверяет минимальное значение. | `['title', 'min', 40]`
`max` | Проверяет максимальное значение. | `['title', 'max', 40]`
`size/range/between` | Проверяет размер и диапазон (поддерживает проверку типов данных `int`, `string`, `array`). | `['tagId', 'size', 'min'=>4, 'max'=>567]`
``` `length` | Проверка длины (похожа на `size`, но проверяет только длину строк и массивов) | `['username', 'length', 'min' => 5, 'max' => 20]`
`fixedSize/sizeEq/lengthEq` | Проверка фиксированной длины или размера (проверяет длину строк и массивов, а также размер целых чисел) | `['field', 'fixedSize', 12]`
`startWith` | Значение (`строка/массив`) начинается с указанной строки | `['field', 'startWith', 'hell']`
`endWith` | Значение (`строка/массив`) заканчивается на указанную строку | `['field', 'endWith', 'world']`
`in/enum` | Проверка наличия в списке значений | `['status', 'in', [1, 2, 3]]`
`notIn` | Проверка отсутствия в списке значений | `['status', 'notIn', [4, cq, 6]]`
`inField` | Проверка наличия значения одного поля в другом поле | `['field', 'inField', 'anotherField']`
`eq/mustBe` | Обязательное равенство указанному значению | `['status', 'mustBe', 1]`
`ne/neq/notBe` | Неравенство указанному значению | `['status', 'notBe', 0]`
`eqField` | Сравнение значений двух полей (равенство) | `['passwd', 'eqField', 'repasswd']`
`neqField` | Сравнение значений двух полей (неравенство) | `['userId', 'neqField', 'targetId']`
`ltField` | Сравнение значений двух полей (меньше) | `['field1', 'ltField', 'field2']`
`lteField` | Сравнение значений двух полей (меньше либо равно) | `['field1', 'lteField', 'field2']`
`gtField` | Сравнение значений двух полей (больше) | `['field1', 'gtField', 'field2']`
`gteField` | Сравнение значений двух полей (больше либо равно) | `['field1', 'gteField', 'field2']`
`requiredIf` | Поле является обязательным, если значение указанного другого поля равно одному из указанных значений (laravel) | `['city', 'requiredIf', 'myCity', ['chengdu']]` `requiredUnless` | Поле не является обязательным, если значение указанного другого поля равно одному из указанных значений (Laravel) | `['city', 'requiredUnless', 'myCity', ['chengdu'] ]`
`requiredWith` | Поле является обязательным, если любое из указанных полей имеет значение (Laravel) | `['city', 'requiredWith', ['myCity'] ]`
`requiredWithAll` | Поле является обязательным, если все указанные поля имеют значения (Laravel) | `['city', 'requiredWithAll', ['myCity', 'myCity1'] ]`
`requiredWithout` | Поле является обязательным, если одно из указанных полей отсутствует (Laravel) | `['city', 'requiredWithout', ['myCity', 'myCity1'] ]`
`requiredWithoutAll` | Это поле является обязательным, если все указанные поля **не имеют значений** (см. Laravel) | `['city', 'requiredWithoutAll', ['myCity', 'myCity1']]`
`date` | Проверяет, что значение является датой | `['publishedAt', 'date']`
`dateFormat` | Проверяет, что значение является датой в указанном формате | `['publishedAt', 'dateFormat', 'Y-m-d']`
`dateEquals` | Проверяет, что значение является датой и равно указанной дате | `['publishedAt', 'dateEquals', '2017-05-12']`
`beforeDate` | Проверяет, что значение находится перед указанной датой (см. Laravel) | `['publishedAt', 'beforeDate', '2017-05-12']`
`beforeOrEqualDate` | Проверяет, что значение меньше либо равно указанной дате (см. Laravel) | `['publishedAt', 'beforeOrEqualDate', '2017-05-12']`
`afterOrEqualDate` | Проверяет, что значение больше либо равно указанной дате (см. Laravel) | `['publishedAt', 'afterOrEqualDate', '2017-05-12']`
`afterDate` | Проверяет, что значение находится после указанной даты | `['publishedAt', 'afterDate', '2017-05-12']` `json` | Проверяет, что значение является JSON-строкой (по умолчанию строго проверяет начало с `{` или `[`) | `['goods', 'json']` `['somedata', 'json', false]` - нестрогое, обычные строки типа `'test'` также проходят
`file` | Проверяет, что значение является загруженным файлом | `['upFile', 'file']`
`image` | Проверяет, что значение является загруженным изображением | `['avatar', 'image']`, ограничивает расширение `['avatar', 'image', 'jpg,png']`
`ip` | Проверяет, что значение является IP-адресом | `['ipAddr', 'ip']`
`ipv4` | Проверяет, что значение является IPv4-адресом | `['ipAddr', 'ipv4']`
`ipv6` | Проверяет, что значение является IPv6-адресом | `['ipAddr', 'ipv6']`
`macAddress` | Проверяет, что значение является MAC-адресом | `['field', 'macAddress']`
`md5` | Проверяет, что значение является строкой MD5-хэша | `['passwd', 'md5']`
`sha1` | Проверяет, что значение является строкой SHA1-хэша | `['passwd', 'sha1']`
`color` | Проверяет, что значение является цветом в формате HTML | `['backgroundColor', 'color']`
`regex/regexp` | Проверяет значение с помощью регулярного выражения | `['name', 'regexp', '/^\w+$/']`
`safe` | Отметка поля как безопасного, не требующего проверки | `['createdAt', 'updatedAt', 'safe']`
### Валидатор `safe`, метка атрибута/поля как безопасногоСпециальный валидатор используется для отметки поля как безопасного, что позволяет пропустить его проверку и сразу добавить в безопасные данные.
Например, поля, добавленные вручную перед записью в базу данных: время создания, время обновления.
```php
['createdAt', 'updatedAt', 'safe']
Поле считается пустым при выполнении одного из следующих условий:
null
.''
.[]
.счётный
объект.Значение считается булевым, если оно соответствует одному из следующих значений (не чувствительно к регистру):
"1"
, "true"
, "on"
и "yes"
(TRUE
)"0"
, "false"
, "off"
, "no"
и ""
(FALSE
)При проверке файлов важно установить источник данных файла.
$v = Validation::make($_POST, [
// [...],
// некоторые правила...
])
->setUploadedFiles($_FILES)
->validate();
// ...
required*
в начале списка правил.int
выполняется путём сравнения величин. Для string
и array
проверяется длина. Диапазон значений включает границы.size/range
могут содержать либо минимальное значение min
, либо максимальное значение max
.
Примеры правил:
```php
['товары.груша', 'макс', 30], //значение поля `груша` в подмассиве `товары` должно быть меньше или равно 30
[
'товары' => [
'яблоко' => 34,
'груша' => 50,
],
'пользователи' => [
['id' => 34, 'имя' => 'том'],
['id' => 89, 'имя' => 'джон'],
]
]
Примеры правил:
['товары.*', 'каждый', 'число'], //каждое значение в подмассиве `товары` должно быть положительным целым числом
// эквивалентная форма записи
// ['товары', 'каждый', 'число'], //каждое значение в подмассиве `товары` должно быть положительным целым числом
// многомерные массивы
['пользователи.*.id', 'каждый', 'обязательно'],
['пользователи.*.id', 'каждый', 'число', 'мин' => 34],
['пользователи.*.имя', 'каждый', 'строка', 'мин' => 5],
*
применение фильтров недействительноpublic function setScene(string $scene);
public function atScene(string $scene); // альтернативный метод для setScene
Устанавливает имя текущего сценария проверки. Будут использоваться только правила, соответствующие текущему сценарию, для проверки данных.
public function validate(array $onlyChecked = [], $stopOnError = null);
Выполняет проверку данных. Возвращает объект валидатора, который позволяет получить информацию о результате проверки.
```- $onlyChecked
можно использовать для указания полей, которые требуется проверить.
$stopOnError
определяет, следует ли немедленно прекратить проверку при первом возникшем ошибочном случае. По умолчанию установлено значение true
.### Добавление пользовательского валидатораpublic function addValidator(string $name, \Closure $callback, string $msg = '');
Добавляет пользовательский валидатор. Возвращает объект валидатора для поддержки цепочки вызовов.
$name
— имя пользовательского валидатора.$callback
— пользовательский валидатор. Обрабатывает проверку, допускается только замыкание.$msg
— опционально. Сообщение об ошибке для данного валидатора.// Проверка провалена
public function isFail();
public function hasError(); // альтернативный метод для isFail()
// Успешная проверка
public function isOk();
public function isPassed();
Получает результат проверки (есть ли ошибки).
public function getErrors(): array;
Получает все сообщения об ошибках, многомерный массив, содержащий все поля и сообщения об ошибках. Пример:
[
['name' => 'field1', 'msg' => 'сообщение об ошибке 1'],
['name' => 'field2', 'msg' => 'сообщение об ошибке 2'],
...
]
Для одного и того же свойства/поля могут быть несколько сообщений об ошибках, если для него были добавлены несколько правил проверки.
public function firstError($onlyMsg = true);
$onlyMsg
определяет, следует ли вернуть только строковое сообщение. При значении false
, возвращается массив, например: ['name' => 'field', 'msg' => 'сообщение об ошибке']
.### Получение последнего сообщения об ошибкеpublic function lastError($onlyMsg = true);
$onlyMsg
определяет, следует ли вернуть только строковое сообщение. При значении false
, возвращается массив, например: ['name' => 'field', 'msg' => 'сообщение об ошибке']
.public function getSafeData(): array|\stdClass;
Получает все безопасные данные, прошедшие успешную проверку.
safeData
будут сброшены до пустого состояния. То есть доступ к safeData
будет возможен только при успешной валидации всех данных.public function val(string $key, $default = null); // альтернативное имя метода getSafe()
public function getValid(string $key, $default = null); // альтернативное имя метода getSafe()
public function getSafe(string $key, $default = null);
Получает значение ключа из прошедших валидацию данных.
public function all(): array;
Получает все данные, переданные во время валидации.
public function getRaw(string $key, $default = null);
```Получает значение ключа из данных, переданных во время валидации.
## Пример кода
Для просмотра рабочего примера обратитесь к разделу `example`.
## Юнит-тестирование
```sh
phpunit
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )