Laravelのセッションを使った入力エラーの一時保存方法
生徒
「フォームに入力した値でエラーがあった場合、入力内容を消さずに戻す方法はありますか?」
先生
「はい、Laravelではセッションという仕組みを使うことで、一時的に入力値やエラーメッセージを保存できます。」
生徒
「セッションって何ですか?」
先生
「セッションは、一時的にユーザーごとにデータを保存する仕組みです。フォームで入力した値やエラー情報をセッションに入れておくと、リロードしても値を保持できます。」
1. セッションを使った入力値の一時保存
フォーム送信後にバリデーションエラーが発生した場合、old()関数を使うと入力値を復元できます。これはセッションに一時保存された値を取得する仕組みです。
<form method="POST" action="{{ route('user.store') }}">
@csrf
<input type="text" name="name" class="form-control" placeholder="名前を入力" value="{{ old('name') }}">
<input type="email" name="email" class="form-control mt-2" placeholder="メールアドレス" value="{{ old('email') }}">
<button type="submit" class="btn btn-primary mt-2">送信</button>
</form>
この{{ old('name') }}の部分で、前回の入力値がセッションから復元されます。エラーが発生した場合でも、ユーザーは入力した値を消さずにフォームを確認できます。
2. コントローラでバリデーションとセッション保存
コントローラでvalidate()を使うと、自動でセッションにエラー情報と入力値が保存されます。
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|max:50',
'email' => 'required|email',
]);
User::create($validated);
return redirect()->route('user.index')->with('success', 'ユーザーを作成しました');
}
ここでバリデーションに失敗すると、自動で入力値はセッションに保存され、エラーメッセージも$errorsでBladeに渡されます。
3. Bladeテンプレートでエラーメッセージを表示する
$errorsを使ってフォーム上にエラーメッセージを表示できます。
@if ($errors->any())
<div class="alert alert-danger">
<ul class="mb-0">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
このようにすると、入力エラーがあった場合にユーザーにわかりやすく表示できます。
4. セッションに保存された値とエラーの流れ
入力値やエラーメッセージは以下の流れで保持されます。
- フォーム送信
- コントローラでバリデーション
- 失敗した場合、セッションに入力値とエラーを保存
- リダイレクトしてフォーム表示
- Bladeで
old()や$errorsを使い復元・表示
この流れを理解することで、ユーザー体験が向上し、フォーム入力時のストレスを減らせます。
5. まとめではなく補足ポイント
・old()はセッションに保存された直近の入力値を取得する
・$errorsはバリデーションエラーを簡単に表示可能
・with()メソッドを使えば、任意のメッセージもセッションに一時保存できる
・セッションをうまく使うことで、フォーム送信のユーザー体験が格段に良くなる