Валидация
Валидация — это ваш щит от неожиданных данных. Она не просто проверяет, но и приводит данные к нужному формату: int превращает строку в число, date — в объект даты, а bool — в true/false. Вы получаете не сырые данные из запроса, а чистые, типизированные и готовые к использованию значения.
Что еще даёт валидация в Imhotep:
- Чистые данные — только те поля, которые вы указали в правилах
- Типизация — строки становятся числами, датами и булевыми значениями
- Безопасность — защита от некорректных или вредоносных данных
- Автоматические ошибки — Imhotep сам вернёт понятный ответ с HTTP-статусом 422
Основной способ проверки — метод validate(...) у request(). Он возвращает только поля, описанные в правилах.
public function store(Request $request)
{
$data = $request->validate([
'name' => 'required|string|max:100',
'email' => 'required|email:dns',
'age' => 'nullable|int|min:18',
]);
// $data содержит только name, email и age.
// $data['age'] — int, если поле было передано.
}
Если проверка не пройдена, Imhotep автоматически выбрасывает исключение ValidationException с HTTP-статусом 422 Unprocessable Entity. Ответ содержит структурированный список ошибок:
{
"message": "Поле email обязательно для заполнения.",
"errors": {
"email": ["Поле email обязательно для заполнения."],
"password": ["Пароль должен содержать минимум 8 символов."]
}
}
Правила
Правила можно записывать строкой через | или массивом. Массив удобен, когда правило содержит запятую или создаётся программно.
$rules = [
'title' => 'required|string|max:150',
'status' => ['required', 'in:draft,published'],
];
Поле можно адресовать точкой. Для каждого элемента массива используйте *:
$data = $request->validate([
// Доступ к вложенным данным через точку
'profile.name' => 'required|string',
'products' => 'required|array|min:1',
// Работа с массивами через *
'products.*.name' => 'required|string|max:120', // каждый элемент массива products должен иметь name
'products.*.price' => 'required|float|min:0', // и price
]);
Необязательные поля
Обычные правила не проверяют отсутствующее поле и пустую строку. Поэтому email допускает отсутствие email, а required|email — нет. Добавляйте nullable, если поле может быть null и остальные правила к нему применять не нужно.
[
'website' => 'nullable|url',
'nickname' => 'string|max:50', // можно не передавать
]
Остановка проверок
Добавьте bail, чтобы для конкретного поля вернуть только первую ошибку. Без него Imhotep собирает все ошибки поля.
[
'email' => 'bail|required|email:dns',
]
Если нужна только первая ошибка во всём наборе данных, создайте валидатор вручную:
use Imhotep\Facades\Validator;
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required|string|min:8',
])->stopOnFirstFailure();
if ($validator->fails()) {
$errors = $validator->errors();
}
Ручная валидация
Фабрика validator() подходит для CLI-команд, сервисов и случаев, когда ошибками нужно управлять самостоятельно. Метод validate() возвращает проверенные данные либо выбрасывает ValidationException.
use Imhotep\Facades\Validator;
$validator = Validator::make($input, [
'phone' => 'required|phone',
'newsletter' => 'bool',
]);
if ($validator->fails()) {
return $validator->errors()->messages();
}
$data = $validator->validated()->toArray();
Метод errors() возвращает набор сообщений. Часто нужны методы first('email'), get('email'), all(), has('email') и messages().
Свои сообщения и названия полей
Третьим аргументом передайте сообщения в формате поле.правило, а четвёртым — понятные названия полей. В тексте доступны плейсхолдеры :attribute и параметры правила, например :max, :min или :date.
$data = $request->validate(
[
'email' => 'required|email',
'password' => 'required|string|min:8',
],
[
'email.required' => 'Укажите электронную почту.',
'password.min' => 'Пароль должен быть не короче :min символов.',
],
[
'email' => 'электронная почта',
'password' => 'пароль',
],
);
Если локализация включена, Imhotep также ищет сообщения в validation.custom.<поле>.<правило> и затем в validation.<правило>. Это позволяет хранить общий перевод правил в языковых файлах.
Form Request
Для больших форм создайте класс, наследующий Imhotep\Http\FormRequest. Он проверяется при создании объекта и передаёт валидированные значения в свойства запроса.
namespace App\Http\Requests;
use Imhotep\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => 'required|string|max:100',
'email' => 'required|email:dns',
];
}
public function messages(): array
{
return ['email.email' => 'Введите корректный email.'];
}
}
Метод before(array $rawData) может вернуть дополнительные данные до проверки, а after() — список дополнительных проверок, запускаемых после успешных правил. Используйте validated() для получения результата.