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

OSCHINA-MIRROR/inhere-php-validate

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 52 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.03.2025 06:45 ee57d89

Валидация PHP

Лицензия PHP Версия Последняя Устойчивая Версия Статус сборки Статус покрытия Статус Github Actions

Маленькая, но мощная библиотека валидации и фильтрации данных на PHP.- Простая и удобная, поддерживает добавление пользовательских валидаторов

  • Поддерживает предварительную проверку, возможность самостоятельного определения пустых значений
  • Поддерживает группировку правил по сценариям или частичную проверку
  • Поддерживает очистку данных перед выполнением проверки с использованием фильтров встроенные фильтры
  • Поддерживает выполнение предварительной и последующей обработки при выполнении проверки независимая обработка проверки
  • Поддерживает настройку сообщений об ошибках для каждого правила, перевод полей и сообщений, поддерживает значения по умолчанию
  • Поддерживает базовую проверку массивов, проверку значений подэлементов массива ('goods.apple'), а также проверку значений подэлементов с помощью шаблонов ('users..id', 'goods.')
  • Легкий доступ к сообщениям об ошибках, получению безопасных данных после проверки (собираются только данные, прошедшие проверку)
  • Включает множество часто используемых валидаторов встроенные валидаторы
  • Настройка правил аналогична 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

Начальная настройка

Метод 1: Прямое использование класса 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);

Способ 3: использование trait 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";
    }
}

Добавление пользовательского валидатора

Основной вызов валидатора поддерживает:

  • Закрытый функциональный объект
  • Название функции
  • Имя метода текущего класса проверки
  • Временный валидатор, добавленный через 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()],

Предварительная/послепроверка

  • Метод 1: Внутри 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;
    }
}
  • Метод 2: 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 можно использовать функционал фильтрации независимо.
  • Для информации о встроенных фильтрах PHP обратитесь к документации.## Сценарий проверки

Если требуется повторное использование определённых правил в различных ситуациях, можно указать сценарий использования этих правил. При выполнении проверки также следует указывать проверяемый сценарий.

Метод 1

Используйте метод scenarios() в производном классе:

    // В производном классе ValidationClass...

    // Определите поля, требующие проверки для разных сценариев.
    // Функциональность аналогична ключу 'on' в правилах, рекомендуется не использовать вместе, чтобы избежать путаницы.
    public function scenarios(): array
    {
        return [
            'create' => ['user', 'pwd', 'code'],
            'update' => ['user', 'pwd'],
        ];
    }

Метод 2

Укажите опцию 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();

Встроенные фильтры> Некоторые встроенные функции PHP могут использоваться напрямую. Например 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 [ 'товары' => [ 'яблоко' => 34, 'груша' => 50, ], ]

Примеры правил:

```php
    ['товары.груша', 'макс', 30], //значение поля `груша` в подмассиве `товары` должно быть меньше или равно 30
  • Поддерживаются проверки значений каждого элемента подмассива.
[
  'товары' => [
       'яблоко' => 34,
       'груша' => 50,
   ],
  'пользователи' => [
       ['id' => 34, 'имя' => 'том'],
       ['id' => 89, 'имя' => 'джон'],
   ]
]

Примеры правил:

    ['товары.*', 'каждый', 'число'], //каждое значение в подмассиве `товары` должно быть положительным целым числом
    // эквивалентная форма записи
    // ['товары', 'каждый', 'число'], //каждое значение в подмассиве `товары` должно быть положительным целым числом

    // многомерные массивы
    ['пользователи.*.id', 'каждый', 'обязательно'],
    ['пользователи.*.id', 'каждый', 'число', 'мин' => 34],
    ['пользователи.*.имя', 'каждый', 'строка', 'мин' => 5],
  • Для полей с шаблоном * применение фильтров недействительно

Некоторые ключевые методы API

Установка сценария проверки

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

Лицензия

MIT

Мои другие проекты

  • inhere/console Легкий и мощный набор инструментов для создания консольных приложений и управления ими
  • inhere/sroute Легкая и быстрая библиотека маршрутизации HTTP-запросов

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/inhere-php-validate.git
git@api.gitlife.ru:oschina-mirror/inhere-php-validate.git
oschina-mirror
inhere-php-validate
inhere-php-validate
master