Формы и запросы — это хлеб любого веб-приложения. В 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 — это про быстрый старт, а не про идеальную валидацию для сложных форм.