Формы и валидация
Данным от пользователя нельзя доверять: поле может быть пустым, слишком длинным или содержать не то, что ожидалось. В Laravel правила проверки описывают одним массивом, а ошибки фреймворк показывает сам.
Форма
В каждой форме с методом POST должна быть директива @csrf — она добавляет скрытое поле с защитным токеном:
<form method="POST" action="/posts">
@csrf
<input type="text" name="title">
<textarea name="body"></textarea>
<button type="submit">Сохранить</button>
</form>Проверка данных
Метод validate() принимает правила и возвращает только проверенные поля:
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
Post::create($data);
return redirect('/posts');
}Если данные не прошли проверку, Laravel сам вернёт пользователя на форму — код ниже validate() не выполнится.
Частые правила
| Правило | Что проверяет |
|---|---|
required | Поле заполнено |
email | Правильный адрес почты |
min:8 / max:255 | Длина строки или величина числа |
integer | Целое число |
unique:users,email | Значения ещё нет в таблице users |
confirmed | Совпадает с полем ..._confirmation |
Несколько правил разделяют вертикальной чертой или передают массивом.
Вывод ошибок
Директива @error показывает сообщение для конкретного поля:
<input type="text" name="title">
@error('title')
<p class="error">{{ $message }}</p>
@enderrorСохранение введённого
Чтобы после ошибки поля не очищались, прежнее значение подставляют функцией old():
<input type="text" name="title" value="{{ old('title') }}">Сообщение об успехе
После сохранения пользователя перенаправляют и передают разовое сообщение:
return redirect('/posts')->with('status', 'Статья сохранена');@if (session('status'))
<p>{{ session('status') }}</p>
@endifСообщение живёт до следующего запроса и исчезает после обновления страницы.
Частая ошибка
Если в форме нет @csrf, при отправке Laravel вернёт ошибку 419 «Page Expired». Токен защищает от подделки запросов с чужих сайтов, поэтому отключать проверку не нужно — просто добавьте директиву в форму.