Валидация

Валидация — это ваш щит от неожиданных данных. Она не просто проверяет, но и приводит данные к нужному формату: 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, если поле было передано.
}
PHP

Если проверка не пройдена, Imhotep автоматически выбрасывает исключение ValidationException с HTTP-статусом 422 Unprocessable Entity. Ответ содержит структурированный список ошибок:

{
  "message": "Поле email обязательно для заполнения.",
  "errors": {
    "email": ["Поле email обязательно для заполнения."],
    "password": ["Пароль должен содержать минимум 8 символов."]
  }
}
PHP

Правила

Правила можно записывать строкой через | или массивом. Массив удобен, когда правило содержит запятую или создаётся программно.

$rules = [
    'title' => 'required|string|max:150',
    'status' => ['required', 'in:draft,published'],
];
PHP

Поле можно адресовать точкой. Для каждого элемента массива используйте *:

$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
]);
PHP

Необязательные поля

Обычные правила не проверяют отсутствующее поле и пустую строку. Поэтому email допускает отсутствие email, а required|email — нет. Добавляйте nullable, если поле может быть null и остальные правила к нему применять не нужно.

[
    'website' => 'nullable|url',
    'nickname' => 'string|max:50', // можно не передавать
]
PHP

Остановка проверок

Добавьте bail, чтобы для конкретного поля вернуть только первую ошибку. Без него Imhotep собирает все ошибки поля.

[
    'email' => 'bail|required|email:dns',
]
PHP

Если нужна только первая ошибка во всём наборе данных, создайте валидатор вручную:

use Imhotep\Facades\Validator;

$validator = Validator::make($request->all(), [
    'email' => 'required|email',
    'password' => 'required|string|min:8',
])->stopOnFirstFailure();

if ($validator->fails()) {
    $errors = $validator->errors();
}
PHP

Ручная валидация

Фабрика 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();
PHP

Метод 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' => 'пароль',
    ],
);
PHP

Если локализация включена, 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.'];
    }
}
PHP

Метод before(array $rawData) может вернуть дополнительные данные до проверки, а after() — список дополнительных проверок, запускаемых после успешных правил. Используйте validated() для получения результата.