Питання на співбесіді: Валідація
Найпопулярніші питання з реальних Laravel/PHP співбесід для всіх рівнів
3 питання
Валідація перевіряє вхідні дані за набором правил перш ніж їх використати. Laravel має багату систему правил і кілька способів валідації.
1. Метод validate() прямо в контролері (найпростіше):
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'unique:users,email'],
'age' => ['nullable', 'integer', 'min:18'],
]);
Якщо перевірка не пройдена, Laravel автоматично:
- для веб-запитів - робить редирект назад зі старими даними та помилками в сесії (доступні через
$errorsу Blade); - для API (запит очікує JSON) - повертає відповідь 422 зі структурою
{ "message": ..., "errors": {...} }.
2. FormRequest - для складнішої логіки правила й авторизацію виносять в окремий клас:
php artisan make:request StorePostRequest
public function rules(): array
{
return ['title' => ['required', 'max:255']];
}
Це розвантажує контролер. Є десятки вбудованих правил (required, email, unique, exists, confirmed, date), власні правила та умовна валідація.
FormRequest - окремий клас, що містить правила валідації та авторизацію, виносячи їх із контролера.
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()->can('create', Post::class);
}
public function rules(): array
{
return ['title' => ['required', 'max:255']];
}
}
// $request - вже провалідовано
public function store(StorePostRequest $request)
{
Post::create($request->validated());
}
Переваги: тонкі контролери, перевикористання правил, метод prepareForValidation() для нормалізації вводу, кастомні повідомлення в messages().
Згенерувати клас, що реалізує ValidationRule:
php artisan make:rule Uppercase
class Uppercase implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail('Поле :attribute має бути у верхньому регістрі.');
}
}
}
$request->validate(['code' => [new Uppercase]]);
Для разових перевірок можна передати замикання прямо в правило: 'field' => [fn ($attr, $value, $fail) => ...].