4.1 KiB
Valid — валидация
App\Helpers\Valid — валидация значений. Два режима:
- Пакетная проверка массива по правилам → массив ошибок.
- Одиночные статические проверки →
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'] = 'Возраст 1–120'; } // диапазон работает
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 : '';