Урок 09

Валидация

Что такое валидация

Валидация — это проверка входящих данных перед их использованием. Она защищает от некорректных, пустых или опасных значений: пустого заголовка, email без @, пароля короче 8 символов.

Валидация в контроллере

Метод validate принимает массив правил. Если данные не проходят — Laravel автоматически возвращает ошибки: редирект с ошибками для web, JSON 422 для API.

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|string|max:255',
        'body' => 'required|string|min:10',
        'email' => 'required|email|unique:users',
        'age' => 'nullable|integer|min:18|max:120',
    ]);

    Post::create($validated);
}

Основные правила

  • required — поле обязательно
  • string — строка
  • email — корректный email
  • integer — целое число
  • min:8 / max:255 — минимальная/максимальная длина или значение
  • between:18,120 — диапазон
  • in:admin,user — значение из списка
  • unique:users — уникально в таблице
  • confirmed — совпадает с полем _confirmation
  • nullable — может быть пустым
  • date — дата
  • before:today / after:today — до/после даты
  • image — загруженный файл — изображение
  • exists:tags,id — существует в таблице
  • array — массив

Form Request

Если правил много — их выносят в отдельный класс:

php artisan make:request StorePostRequest
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'body' => 'required|string|min:10',
        ];
    }

    public function messages(): array
    {
        return [
            'title.required' => 'Заголовок обязателен',
        ];
    }
}

Контроллер:

public function store(StorePostRequest $request)
{
    Post::create($request->validated());
}

authorize() определяет, имеет ли пользователь право выполнить действие.

Кастомные правила

php artisan make:rule Uppercase
namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class Uppercase implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strtoupper($value) !== $value) {
            $fail('Поле :attribute должно быть в верхнем регистре');
        }
    }
}

Использование:

'title' => ['required', new Uppercase()],

Вывод ошибок в Blade

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

<input name="title" value="{{ old('title') }}">

old() возвращает предыдущее значение после ошибки.