Сохранение ввода формы при редиректе в Laravel
Представьте форму регистрации или комментария. Пользователь заполнил несколько полей, нажал «Отправить», а сервер нашёл ошибку - например, пустой email. Вы делаете редирект назад на форму. Без дополнительной настройки все поля окажутся пустыми: придётся вводить всё заново. Это раздражает и выглядит как баг.
Нужно сохранить отправленные данные
на один следующий запрос и подставить
их обратно в value полей.
При редиректе это делают методом
withInput, а в шаблоне читают
через old.
В контроллере при ошибке возвращаемся назад и сохраняем ввод:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function store(Request $request)
{
if (!$request->filled('email')) {
return back()->withInput();
}
return redirect('/success');
}
}
?>
Данные формы попадают во flash-сессию
на один запрос. В Blade их достают
хелпером old - по имени поля:
<form method="POST" action="/posts">
@csrf
<input
type="text"
name="email"
value="{{ old('email') }}"
>
<button type="submit">send</button>
</form>
Если old('email') есть -
в поле подставится то, что пользователь
уже вводил. Если нет (первый заход
на форму) - будет пустая строка.
Спросите у пользователя email с помощью формы. Если email пустой, вернитесь назад с сохранением ввода и покажите в поле то, что уже вводили.
Если email заполнен, выполните редирект на другое действие и выведите email в представлении.
Добавьте в форму ещё одно поле
и тоже восстановите его через
old.