Урок 7: Формы и валидация в Laravel

В 7-ом уроке мы погрузимся в одну из самых важных тем для веб-разработки, это работу с формами и их валидацию в Laravel. Без этого невозможно создать интерактивное приложение, где пользователи могут регистрироваться, оставлять комментарии или отправлять данные.

Создание HTML-форм в Blade

Формы это мост между пользователем и вашим приложением. В Laravel для их создания удобно использовать шаблонизатор Blade. Давайте разберёмся, как это работает.

Базовая структура формы

В Blade формы создаются с помощью тега <form>, но Laravel рекомендует использовать встроенные директивы для удобства и безопасности. Например:

html
<form method="POST" action="{{ route('form.submit') }}">
    @csrf
    <input type="text" name="username">
    <button type="submit">Отправить</button>
</form>
  • @csrf добавляет скрытое поле с токеном для защиты от CSRF-атак. Это обязательно для всех POST-форм в Laravel.
  • action указывает на маршрут, который обработает данные. Здесь используется хелпер route(), чтобы генерировать URL по имени маршрута.
  • method может быть GET, POST, PUT, PATCH или DELETE. Для методов, кроме GET и POST, потребуется добавить директиву @method('PUT') (например, для обновления данных).

Пример: форма обратной связи

Допустим, мы хотим создать форму для отправки сообщения. В файле resources/views/feedback.blade.php:

html
<form method="POST" action="{{ route('feedback.store') }}">
    @csrf
    <div>
        <label>Имя:</label>
        <input type="text" name="name" value="{{ old('name') }}">
    </div>
    <div>
        <label>Email:</label>
        <input type="email" name="email" value="{{ old('email') }}">
    </div>
    <div>
        <label>Сообщение:</label>
        <textarea name="message">{{ old('message') }}</textarea>
    </div>
    <button type="submit">Отправить</button>
</form>
  • old('field') сохраняет введённые данные после неудачной валидации, чтобы пользователь не вводил всё заново.

Обработка данных формы в контроллере

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

Шаг 1: Создание контроллера

Выполните команду в терминале:

bash
php artisan make:controller FeedbackController

Шаг 2: Добавление метода store()

В app/Http/Controllers/FeedbackController.php:

php
public function store(Request $request) 
{
    // Получаем данные из формы
    $data = $request->all();
    
    // Сохраняем в базу (пример)
    Feedback::create($data);
    
    return redirect()->back()->with('success', 'Сообщение отправлено!');
}

Шаг 3: Настройка маршрута

В routes/web.php:

php
Route::post('/feedback', [FeedbackController::class, 'store'])->name('feedback.store');

Валидация через validate() и кастомные правила

Валидация это проверка данных на корректность. Laravel предоставляет простой и мощный инструмент для этого.

Базовая валидация

Модифицируем метод store() в контроллере:

php
public function store(Request $request) 
{
    $validated = $request->validate([
        'name' => 'required|min:2|max:50',
        'email' => 'required|email',
        'message' => 'required|min:10|max:1000'
    ]);

    Feedback::create($validated);
    return redirect()->back()->with('success', 'Сообщение отправлено!');
}
  • required — поле обязательно для заполнения.
  • min:2 — минимальная длина 2 символа.
  • email — проверка на корректность email.

Если валидация не пройдена, Laravel автоматически перенаправит пользователя обратно с ошибками.

Кастомные правила

Иногда стандартных правил недостаточно. Создадим своё правило, например, для запрета определённых слов в сообщении.

Шаг 1: Генерация правила

bash
php artisan make:rule ForbiddenWords

Шаг 2: Реализация логики
В файле app/Rules/ForbiddenWords.php:

php
public function passes($attribute, $value)
{
    $forbiddenWords = ['спам', 'реклама', 'халява'];
    foreach ($forbiddenWords as $word) {
        if (stripos($value, $word) !== false) {
            return false;
        }
    }
    return true;
}

public function message()
{
    return 'Сообщение содержит запрещённые слова.';
}

Шаг 3: Использование в контроллере

php
use App\Rules\ForbiddenWords;

$request->validate([
    'message' => ['required', new ForbiddenWords]
]);

Вывод ошибок валидации в шаблоне

Ошибки валидации нужно показать пользователю. В Blade это делается через директиву @error и объект $errors.

Пример вывода ошибок

Добавим в форму блоки с сообщениями:

html
<div>
    <label>Имя:</label>
    <input type="text" name="name" value="{{ old('name') }}">
    @error('name')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
</div>

Вывод всех ошибок сразу

Если хотите показать все ошибки вверху формы:

html
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Практические задачи

Закрепим знания на примерах!

Задача 1: Форма регистрации

Создайте форму регистрации с полями:

  • Логин (обязательное, минимум 3 символа)
  • Пароль (обязательное, минимум 8 символов)
  • Email (обязательное, валидный email)

Решение:
Контроллер:

php
public function register(Request $request)
{
    $request->validate([
        'login' => 'required|min:3',
        'password' => 'required|min:8',
        'email' => 'required|email'
    ]);
    // Регистрация пользователя...
}

Задача 2: Кастомное правило для пароля

Создайте правило, чтобы пароль содержал хотя бы одну цифру и спецсимвол.

Решение:
В кастомном правиле PasswordRule:

php
public function passes($attribute, $value)
{
    return preg_match('/[0-9]/', $value) && preg_match('/[!@#$%^&*]/', $value);
}

public function message()
{
    return 'Пароль должен содержать цифру и спецсимвол (!@#$%^&*).';
}

Итоги 7-го урока

Сегодня мы разобрали ключевые аспекты работы с формами и валидацией в Laravel. Теперь вы умеете:

  1. Создавать безопасные формы в Blade.
  2. Обрабатывать данные в контроллерах.
  3. Валидировать входные данные.
  4. Выводить ошибки пользователю.

Полный курс по Laravel для начинающих по ссылке: https://max-gabov.ru/laravel-dlya-nachinaushih

Уверен, теперь вы сможете создавать надёжные и удобные формы в своих проектах. До встречи в следующем уроке.