Files
ave-cms/help/helpers/Valid.md
T
2026-07-27 12:58:44 +03:00

4.1 KiB
Raw Blame History

Valid — валидация

App\Helpers\Valid — валидация значений. Два режима:

  1. Пакетная проверка массива по правилам → массив ошибок.
  2. Одиночные статические проверки → bool.
use App\Helpers\Valid;

Режим 1: пакетная проверка

Valid::check(array $data, array $rules, array $labels = []): array

Возвращает ['поле' => 'сообщение об ошибке']; пустой массив = всё валидно. Для поля берётся первая сработавшая ошибка.

Формат правил: строка через | (или массив правил). Параметры — через :, несколько параметров — через ,. Пустое значение при отсутствии required пропускает остальные правила поля.

$errors = Valid::check($_POST, [
    'email' => 'required|email',
    'name'  => 'required|maxLength:255',
    'age'   => 'required|int|min:1|max:120',
    'slug'  => 'slug',
    'when'  => 'date:Y-m-d',
], [
    'email' => 'E-mail',        // подписи полей для сообщений
    'name'  => 'Имя',
]);

if ($errors) {
    // например, отдать в форму / вернуть 422
    return $this->error('Проверьте поля', $errors);
}

Доступные имена правил: required, email, url, ip, numeric, int/integer, float, alpha, alphaNum, slug, phone, date:FORMAT, min:N, max:N, minLength:N, maxLength:N, length:N, regex:PATTERN, inArray:a,b,c.

Свои тексты ошибок:

Valid::setMessages([
    'required'  => ':label обязательно для заполнения',
    'maxLength' => ':label — не длиннее :param символов',
]);

⚠️ Нюанс: правило int/integer в check() проверяет только «это целое» и игнорирует диапазон (int:1,120 не сработает как границы). Для диапазона добавляйте отдельные min: / max:. Диапазон у int() работает только при прямом статическом вызове (см. ниже).


Режим 2: одиночные проверки (bool)

Метод Проверяет
required($v) Не пусто.
email($v) / url($v) / ip($v) / ipv4($v) / ipv6($v) Форматы.
numeric($v) Число (в т.ч. строкой).
int($v, $min = null, $max = null) Целое с диапазоном.
float($v) Дробное.
alpha($v) / alphaNum($v) Только буквы / буквы+цифры.
slug($v) Корректный ЧПУ-slug.
minLength/maxLength/length($v, $n) Длина строки.
regex($v, $pattern) По регулярке.
inArray($v, array $allowed) Из белого списка.
phone($v) Телефон.
date($v, $format = 'Y-m-d') Дата по формату.
min($v, $min) / max($v, $max) Числовые границы.
if (!Valid::email($email))          { $err['email'] = 'Неверный e-mail'; }
if (!Valid::int($age, 1, 120))      { $err['age']   = 'Возраст 1120'; }   // диапазон работает
if (!Valid::inArray($sort, ['asc', 'desc'])) { $sort = 'asc'; }             // нормализация

Рецепты

Валидация формы в контроллере с ответом 422:

$errors = Valid::check($_POST, [
    'title'     => 'required|maxLength:255',
    'rubric_id' => 'required|int',
]);
if ($errors) { return $this->error('Проверьте поля', $errors); }

Быстрая проверка одного значения перед использованием:

$email = Valid::email($raw) ? $raw : '';