Валидация тела запроса в Laravel: лучшие практики

от автора

в
Время чтения: 2 мин.

Веб-приложения постоянно обрабатывают входящие данные от пользователей, и их валидация — критически важный аспект безопасности и стабильности приложения. Laravel предлагает мощные инструменты для проверки входящих запросов. В этой статье рассмотрим основные методы валидации тела HTTP-запроса в Laravel.

Почему валидация важна?

Правильная валидация данных позволяет:

  • Обеспечить целостность данных
  • Защитить приложение от некорректных данных
  • Улучшить пользовательский опыт
  • Предотвратить многие уязвимости

Методы валидации в Laravel

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

Самый простой способ — использовать метод validate() объекта Request:

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|string|max:255',
        'content' => 'required|string|min:100',
        'published_at' => 'nullable|date',
        'author_id' => 'required|exists:authors,id'
    ]);

    // Работа с проверенными данными
    $post = Post::create($validated);

    return response()->json($post, 201);
}

При невалидных данных Laravel автоматически сгенерирует исключение ValidationException, которое будет обработано на уровне приложения.

2. Form Request — профессиональный подход

Для сложных сценариев лучше создать отдельный класс запроса:

php artisan make:request StorePostRequest

В созданном классе определим правила:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize()
    {
        return true; // Или проверка прав доступа
    }

    public function rules()
    {
        return [
            'title' => 'required|string|max:255',
            'content' => 'required|string|min:100',
            'meta.title' => 'nullable|string|max:60',
            'tags' => 'array',
            'tags.*' => 'integer|exists:tags,id',
            'attachment' => 'file|mimes:pdf,docx|max:5120'
        ];
    }

    public function attributes()
    {
        return [
            'meta.title' => 'meta title',
            'tags.*' => 'tag'
        ];
    }
}

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

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

    return response()->json($post, 201);
}

3. Ручная валидация с Validator

Для особых случаев можно использовать фасад Validator:

use Illuminate\Support\Facades\Validator;

public function update(Request $request, Post $post)
{
    $validator = Validator::make($request->all(), [
        'title' => 'sometimes|string|max:255',
        'status' => 'required|in:draft,published,archived'
    ]);

    $validator->validate(); // Выбросит ValidationException при ошибках

    $post->update($request->only(['title', 'status']));

    return response()->json($post);
}

Правила валидации

Laravel предлагает множество встроенных правил:

Базовые правила:

  • required, filled, nullable
  • string, integer, boolean, array, date
  • email, ip, url, uuid

Проверки значений:

  • min:value, max:value
  • between:min,max
  • in:foo,bar,...
  • not_in:foo,bar,...

Проверки файлов:

  • file, image
  • mimes:jpeg,png,pdf
  • max:1024 (размер в KB)

Проверки БД:

  • exists:table,column
  • unique:table,column

Специальные правила:

  • confirmed (для password_confirmation)
  • current_password
  • regex:/pattern/

Кастомизация сообщений об ошибках

Вы можете переопределить сообщения об ошибках:

public function messages()
{
    return [
        'title.required' => 'Заголовок обязателен для заполнения',
        'content.min' => 'Содержание должно быть не менее :min символов',
        'tags.*.exists' => 'Выбранный тег не существует'
    ];
}

Обработка ошибок валидации

Все ошибки валидации автоматически обрабатываются в App\Exceptions\Handler. По умолчанию для веб-запросов Laravel перенаправляет назад с ошибками, а для API возвращает JSON-ответ с кодом 422.

Вы можете кастомизировать этот процесс, переопределив метод render() в обработчике исключений.

Заключение

Laravel предоставляет гибкую систему валидации, которая покрывает большинство потребностей веб-приложения. Использование Form Request классов делает код чище и более поддерживаемым, особенно для сложных сценариев валидации.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 3 + 10?