Класс 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'
];
}
}
?>