Этот вопрос проверяет понимание механизма Form Request в Laravel и его роли в обработке и валидации входящих HTTP-запросов.
Form Request — это специальный класс в Laravel для обработки HTTP-запросов с встроенной валидацией и авторизацией. Он инкапсулирует логику проверки входных данных и определяет правила валидации в отдельном классе, делая контроллеры чище. Form Request автоматически проверяет данные и возвращает ошибки если валидация не пройдена.
Form Request — это мощный инструмент в Laravel для централизованной обработки входящих HTTP-запросов, сочетающий в себе валидацию, авторизацию и подготовку данных.
Определение правил проверки входных данных
Автоматическое перенаправление при ошибках
Кастомные сообщения об ошибках
class StoreUserRequest extends FormRequest {
public function rules() {
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'role' => 'sometimes|in:admin,user,moderator',
];
}
public function messages() {
return [
'email.unique' => 'Этот email уже занят',
'password.min' => 'Пароль должен быть не менее 8 символов',
];
}
}Проверка прав доступа пользователя
Определение, может ли пользователь выполнить действие
class UpdateUserRequest extends FormRequest {
public function authorize() {
// Пользователь может обновлять только свой профиль
return $this->user()->id === $this->route('user')->id;
}
public function rules() {
return [
'name' => 'sometimes|string|max:255',
'email' => 'sometimes|email|unique:users,email,' . $this->route('user')->id,
];
}
}Нормализация данных перед валидацией
Добавление вычисляемых полей
class CreatePostRequest extends FormRequest {
protected function prepareForValidation() {
$this->merge([
'slug' => Str::slug($this->title),
'user_id' => auth()->id(),
]);
}
public function rules() {
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'slug' => 'required|unique:posts',
'user_id' => 'required|exists:users,id',
];
}
}class UserController extends Controller {
public function store(StoreUserRequest $request) {
// Данные уже прошли валидацию
$validated = $request->validated();
$user = User::create($validated);
return response()->json($user, 201);
}
public function update(UpdateUserRequest $request, User $user) {
// Авторизация уже проверена
$validated = $request->validated();
$user->update($validated);
return response()->json($user);
}
}Контроллеры освобождаются от логики валидации
Упрощается чтение и поддержка кода
Один Form Request может использоваться в нескольких контроллерах
Легко модифицировать правила валидации
Form Request легко тестировать изолированно
Можно тестировать правила валидации отдельно от бизнес-логики
class StoreUserRequestTest extends TestCase {
public function test_validation_rules() {
$request = new StoreUserRequest();
$rules = $request->rules();
$this->assertArrayHasKey('email', $rules);
$this->assertContains('required', $rules['email']);
$this->assertContains('email', $rules['email']);
}
}Form Request — это эффективный способ организовать валидацию и авторизацию в Laravel приложениях, делая код более структурированным, безопасным и легким в поддержке.