Формы и запросы — это хлеб любого веб-приложения. В Laravel всё красиво выглядит в доке: Request, validate(), сообщения об ошибках. Но как только у тебя форма чуть сложнее «имя + email», сразу всплывают нюансы: кастомные правила, локализация ошибок, валидация массивов. И тут уже «магия Ларавела» превращается в привычное «ну давай костылим».
Шаг 1. Маршруты: просто, но можно встрять
Route::get('/form', 'FormController@showForm');
Route::post('/form', 'FormController@submitForm');
Красота? Да. Но если ты забудешь CSRF-токен — Laravel просто откажется работать. И будешь потом ломать голову, почему твой POST возвращает 419.
Шаг 2. Контроллер: мясо
php artisan make:controller FormController
Добавляем методы:
public function showForm()
{
return view('form');
}
public function submitForm(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|max:255',
]);
// Здесь уже твой код: БД, сервисы и т.д.
return redirect('/form')->with('success', 'Form submitted!');
}
Фишка: validate() не просто проверяет, а сразу редиректит назад при ошибке. Удобно? Да. Прозрачно? Не всегда — отлавливать кастомные ошибки сложнее.
Шаг 3. Форма: Blade и вечный @csrf
<form action="/form" method="post">
@csrf
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<label for="email">Email:</label>
<input type="email" id="email" name="email">
<button type="submit">Submit</button>
</form>
CSRF — штука нужная, но если забудешь директиву @csrf, Laravel откусит голову.
Шаг 4. Сообщения и ошибки
@if (session('success'))
<div>{{ session('success') }}</div>
@endif
@error('name')
<div>{{ $message }}</div>
@enderror
Работает из коробки. Но как только надо сделать нормальный вывод ошибок в JSON для API — придётся писать ручками FormRequest или свои ResponseFactory.
Шаг 5. FormRequest — спасение от срача в контроллере
Если у тебя больше пары полей, контроллер быстро превращается в свалку. Laravel придумал FormRequest, чтобы вынести валидацию в отдельный класс.
Создаём запрос:
php artisan make:request FormRequest
В app/Http/Requests/FormRequest.php получаем такой скелет:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FormRequest extends FormRequest
{
public function authorize()
{
return true; // здесь можно рубить доступ по ролям
}
public function rules()
{
return [
'name' => 'required|max:255',
'email' => 'required|email|max:255',
];
}
}
Шаг 6. Используем FormRequest в контроллере
Теперь вместо того, чтобы городить $request->validate(...) прямо в методе, принимаем наш новый класс:
use App\Http\Requests\FormRequest;
class FormController extends Controller
{
public function submitForm(FormRequest $request)
{
// сюда попадут только валидные данные
$validated = $request->validated();
// работаешь с $validated как с нормальным массивом
// например, сохраняешь в БД
// User::create($validated);
return redirect('/form')->with('success', 'Form submitted!');
}
}
Зачем это нужно
- Контроллер становится чище, без простыней с правилами.
- Удобнее переиспользовать валидацию: один
FormRequestможно юзать в разных контроллерах. - Можно делать разные классы под разные сценарии (
StoreUserRequest,UpdateUserRequestи т.д.). - Для API проще навесить кастомные
messages()и возвращать осмысленные JSON-ответы.
Пример кастомных сообщений:
public function messages()
{
return [
'name.required' => 'Имя не забыли?',
'email.email' => 'Ну это даже не похоже на email',
];
}Где начинаются грабли
- Сложные формы. Когда валидация вложенных массивов (
items.*.price) — отладка превращается в ад. - Многоязычие. Laravel умеет локализовать ошибки, но если хочешь человеческие тексты — готовься переписывать
lang/validation.php. - Кастомные правила. Красиво выглядят в доке, но если у тебя бизнес-логика с кучей условий — проще писать сервис руками, чем тащить всё в rules.
Итог
Да, Laravel упрощает обработку запросов. Но как только твоя форма выходит за рамки «2 поля» — магия исчезает, и ты остаёшься с обычным PHP-кодом и костылями.
Laravel — это про быстрый старт, а не про идеальную валидацию для сложных форм.
0 комментариев