РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
641 of 1392 menu

Класс FormRequest

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

Создание FormRequest

Для создания класса запроса используется команда Artisan:

<?php php artisan make:request StoreArticleRequest ?>

После выполнения команды в директории app/Http/Requests появится файл с заготовкой класса:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreArticleRequest extends FormRequest { public function authorize(): bool { return false; } public function rules(): array { return [ // ]; } } ?>

Метод authorize

Метод authorize определяет, может ли пользователь выполнить данный запрос. Если метод возвращает false, будет выброшено исключение с кодом 403:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreArticleRequest extends FormRequest { public function authorize(): bool { return auth()->check(); } public function rules(): array { return [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'category_id' => 'required|exists:categories,id' ]; } } ?>

Метод rules

Метод rules определяет правила валидации для полей формы. Он должен возвращать массив, где ключи - это имена полей, а значения - правила проверки:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; use IlluminateValidationRule; class StoreArticleRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => ['required', 'string', 'max:255'], 'content' => ['required', 'string'], 'status' => ['required', Rule::in(['draft', 'published'])], 'category_id' => ['required', 'exists:categories,id'], 'tags' => ['nullable', 'array'], 'tags.*' => ['string', 'max:50'] ]; } } ?>

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

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

<?php namespace AppHttpControllers; use AppHttpRequestsStoreArticleRequest; use AppModelsArticle; class ArticleController extends Controller { public function store(StoreArticleRequest $request) { $validated = $request->validated(); $article = Article::create($validated); return redirect()->route('articles.show', $article); } } ?>

Метод validated

Метод validated возвращает отфильтрованный массив валидированных данных. В отличие от метода all, он возвращает только те поля, которые прошли валидацию:

<?php namespace AppHttpControllers; use AppHttpRequestsStoreArticleRequest; class ArticleController extends Controller { public function update(StoreArticleRequest $request, $id) { $validated = $request->validated(); foreach ($validated as $key => $value) { echo "$key: $value\n"; } } } ?>

Результат выполнения кода:

"title: Updated article" "content: New content for article" "status: published"

Кастомные сообщения

Метод messages позволяет переопределить стандартные сообщения об ошибках для конкретных правил:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreArticleRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => 'required|string|min:3|max:255', 'content' => 'required|string|min:10', 'status' => 'required|in:draft,published' ]; } public function messages(): array { return [ 'title.required' => 'The title field is mandatory', 'title.min' => 'The title must be at least 3 characters', 'content.required' => 'The content cannot be empty', 'status.in' => 'The status must be draft or published' ]; } } ?>

Переименование полей

Метод attributes позволяет задать читаемые имена для полей, которые будут использоваться в сообщениях об ошибках:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreArticleRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'category_id' => 'required|exists:categories,id' ]; } public function attributes(): array { return [ 'title' => 'article title', 'content' => 'article content', 'category_id' => 'category' ]; } } ?>

Подготовка данных

Метод prepareForValidation позволяет модифицировать данные перед валидацией. Например, можно привести строки к нижнему регистру или преобразовать формат даты:

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreArticleRequest extends FormRequest { protected function prepareForValidation(): void { $this->merge([ 'email' => strtolower($this->email), 'slug' => str_replace(' ', '-', $this->title) ]); } public function rules(): array { return [ 'email' => 'required|email|unique:users,email', 'slug' => 'required|string|unique:articles,slug', 'title' => 'required|string|max:255' ]; } } ?>

Смотрите также

  • метод rules,
    который определяет правила валидации
  • метод messages,
    который переопределяет сообщения об ошибках
  • метод validated,
    который возвращает отфильтрованные данные
  • метод validate,
    который выполняет валидацию на лету
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить