В 7-ом уроке мы погрузимся в одну из самых важных тем для веб-разработки, это работу с формами и их валидацию в Laravel. Без этого невозможно создать интерактивное приложение, где пользователи могут регистрироваться, оставлять комментарии или отправлять данные.
Создание HTML-форм в Blade
Формы это мост между пользователем и вашим приложением. В Laravel для их создания удобно использовать шаблонизатор Blade. Давайте разберёмся, как это работает.
Базовая структура формы
В Blade формы создаются с помощью тега <form>
, но Laravel рекомендует использовать встроенные директивы для удобства и безопасности. Например:
<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
:
<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: Создание контроллера
Выполните команду в терминале:
php artisan make:controller FeedbackController
Шаг 2: Добавление метода store()
В app/Http/Controllers/FeedbackController.php
:
public function store(Request $request) { // Получаем данные из формы $data = $request->all(); // Сохраняем в базу (пример) Feedback::create($data); return redirect()->back()->with('success', 'Сообщение отправлено!'); }
Шаг 3: Настройка маршрута
В routes/web.php
:
Route::post('/feedback', [FeedbackController::class, 'store'])->name('feedback.store');
Валидация через validate() и кастомные правила
Валидация это проверка данных на корректность. Laravel предоставляет простой и мощный инструмент для этого.
Базовая валидация
Модифицируем метод store()
в контроллере:
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: Генерация правила
php artisan make:rule ForbiddenWords
Шаг 2: Реализация логики
В файле app/Rules/ForbiddenWords.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: Использование в контроллере
use App\Rules\ForbiddenWords; $request->validate([ 'message' => ['required', new ForbiddenWords] ]);
Вывод ошибок валидации в шаблоне
Ошибки валидации нужно показать пользователю. В Blade это делается через директиву @error
и объект $errors
.
Пример вывода ошибок
Добавим в форму блоки с сообщениями:
<div> <label>Имя:</label> <input type="text" name="name" value="{{ old('name') }}"> @error('name') <div class="alert alert-danger">{{ $message }}</div> @enderror </div>
Вывод всех ошибок сразу
Если хотите показать все ошибки вверху формы:
@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)
Решение:
Контроллер:
public function register(Request $request) { $request->validate([ 'login' => 'required|min:3', 'password' => 'required|min:8', 'email' => 'required|email' ]); // Регистрация пользователя... }
Задача 2: Кастомное правило для пароля
Создайте правило, чтобы пароль содержал хотя бы одну цифру и спецсимвол.
Решение:
В кастомном правиле PasswordRule
:
public function passes($attribute, $value) { return preg_match('/[0-9]/', $value) && preg_match('/[!@#$%^&*]/', $value); } public function message() { return 'Пароль должен содержать цифру и спецсимвол (!@#$%^&*).'; }
Итоги 7-го урока
Сегодня мы разобрали ключевые аспекты работы с формами и валидацией в Laravel. Теперь вы умеете:
- Создавать безопасные формы в Blade.
- Обрабатывать данные в контроллерах.
- Валидировать входные данные.
- Выводить ошибки пользователю.
Полный курс по Laravel для начинающих по ссылке: https://max-gabov.ru/laravel-dlya-nachinaushih
Уверен, теперь вы сможете создавать надёжные и удобные формы в своих проектах. До встречи в следующем уроке.