← Назад к вопросам

Как называется класс проверки запроса endpoint в методологии Laravel?

2.0 Middle🔥 161 комментариев
#Фреймворки

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Класс проверки запроса в Laravel: Form Request

В методологии Laravel класс для валидации запросов к эндпоинтам называется Form Request. Это специализированный класс валидации, который инкапсулирует логику проверки входных данных, авторизации и даже кастомных сообщений об ошибках.

Что такое Form Request?

Form Request — это кастомный класс запроса, наследующий базовый класс Illuminate\Foundation\Http\FormRequest. Он представляет собой мощный инструмент для централизованной валидации входящих HTTP-запросов перед их попаданием в контроллер. Ключевая идея в том, чтобы вынести валидацию из контроллеров в отдельные классы, следуя принципу единственной ответственности (Single Responsibility Principle).

Основные возможности Form Request

  1. Автоматическая валидация: Laravel автоматически выполняет правила валидации перед вызовом метода контроллера. При неудаче генерируется ответ с ошибками (по умолчанию — редирект назад с сохранением ввода и ошибок в сессии, либо JSON-ответ для API).
  2. Авторизация: В классе можно определить, имеет ли аутентифицированный пользователь право выполнять данный запрос.
  3. Кастомные сообщения об ошибках: Удобное переопределение стандартных сообщений валидации.
  4. Подготовка данных (Sanitization): Возможность очистки или модификации данных перед валидацией.

Практический пример

1. Создание Form Request

Создадим класс для валидации запроса на создание статьи:

php artisan make:request StoreArticleRequest

Это сгенерирует файл app/Http/Requests/StoreArticleRequest.php.

2. Структура класса Form Request

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreArticleRequest extends FormRequest
{
    /**
     * Определяем, авторизован ли пользователь для выполнения запроса.
     * Если метод возвращает false, автоматически вернется HTTP-ответ 403.
     */
    public function authorize(): bool
    {
        // Например, проверяем, является ли пользователь автором
        // return $this->user()->role === 'author';
        
        // Для простоты разрешим всем (но в реальном проекте так делать не стоит)
        return true;
    }

    /**
     * Правила валидации для запроса.
     * Выполняются автоматически до вызова метода контроллера.
     */
    public function rules(): array
    {
        return [
            'title' => [
                'required',
                'string',
                'max:255',
                Rule::unique('articles')->ignore($this->route('article')), // Для обновления
            ],
            'content' => ['required', 'string', 'min:50'],
            'category_id' => ['required', 'integer', 'exists:categories,id'],
            'tags' => ['sometimes', 'array'],
            'tags.*' => ['integer', 'exists:tags,id'],
            'published_at' => ['nullable', 'date'],
        ];
    }

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

    /**
     * Кастомные имена атрибутов для сообщений об ошибках (опционально).
     */
    public function attributes(): array
    {
        return [
            'category_id' => 'категория',
            'tags' => 'теги',
        ];
    }

    /**
     * Подготовка данных к валидации (опционально).
     * Выполняется ДО применения правил валидации.
     */
    protected function prepareForValidation(): void
    {
        // Например, добавим slug на основе title
        $this->merge([
            'slug' => str($this->title)->slug(),
        ]);
    }
}

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

<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreArticleRequest;
use App\Models\Article;

class ArticleController extends Controller
{
    /**
     * Сохраняем новую статью.
     * Form Request автоматически выполнит валидацию.
     * В метод контроллера попадут уже валидированные данные.
     */
    public function store(StoreArticleRequest $request)
    {
        // Данные уже прошли валидацию!
        $validated = $request->validated();
        
        // Создаем статью
        $article = Article::create($validated);
        
        // Синхронизируем теги, если они есть
        if ($request->has('tags')) {
            $article->tags()->sync($request->tags);
        }
        
        return redirect()->route('articles.show', $article)
            ->with('success', 'Статья успешно создана!');
    }
    
    /**
     * Обновление статьи также использует Form Request.
     */
    public function update(StoreArticleRequest $request, Article $article)
    {
        $article->update($request->validated());
        
        return redirect()->back()->with('success', 'Статья обновлена!');
    }
}

Преимущества использования Form Request

  • Чистота контроллеров: Контроллеры становятся тоньше и сосредоточены только на бизнес-логике.
  • Повторное использование: Один Form Request может использоваться в нескольких методах или контроллерах.
  • Автоматическая инъекция зависимостей: Form Request автоматически резолвится контейнером Laravel.
  • Согласованность: Единый подход к валидации во всем приложении.
  • Тестируемость: Form Request легко тестировать изолированно.

Альтернативы и связанные концепции

Хотя Form Request является основным инструментом, иногда разработчики используют:

  • Валидацию в контроллере через $request->validate([]) — для простых случаев.
  • Пакеты для более сложной валидации, например, laravel-validation-rules.
  • Object Relational Mapping (ORM) валидацию на уровне моделей (через трейты или observer'ы), но это считается менее предпочтительным для валидации запросов.

Важный нюанс: Form Request следует отличать от обычных Request классов, которые могут создаваться командой php artisan make:request без наследования от FormRequest. Однако в контексте валидации эндпоинтов всегда используется именно Form Request.

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

Как называется класс проверки запроса endpoint в методологии Laravel? | PrepBro