| この記事の要点 |
|
結論:value に old() を書く
Laravel でバリデーションエラーがあった場合に、入力値を再度表示させるには、フォームの value 属性に old() ヘルパーを書きます。
<input type="url" name="url" value="{{ old('url') }}" required="required">
入力フォームの値を保持したい場合は {{ old(name) }} を使用します。デフォルト値を設定したい場合は {{ old(name, デフォルト値) }} としてください。old の第 1 引数には、input の name 属性と同じ文字列を指定します。
仕組み:入力値はセッションに一時保存される
フォーム送信 → バリデーション失敗 → 元の画面へリダイレクト、という流れでは、リダイレクトによってリクエストが 1 回切れるため、送信された値はそのままでは失われます。Laravel はこれを次のように解決しています。
- バリデーションに失敗すると、送信された入力値をセッションにフラッシュ(次の 1 リクエストだけ有効な一時保存)する
- エラーメッセージも同様にフラッシュし、直前の画面へリダイレクトする
- リダイレクト先の画面で
old('キー')を呼ぶと、フラッシュされた値が取り出せる - その次のリクエストではフラッシュデータは消える
コントローラで $request->validate([...]) や Form Request を使っている場合、この 1〜2 の処理は自動で行われます。
public function store(Request $request)
{
$validated = $request->validate([
'url' => ['required', 'url'],
'title' => ['required', 'max:100'],
]);
// 失敗した場合はここに来ず、入力値付きで前の画面へ戻る
Bookmark::create($validated);
return redirect()->route('bookmarks.index');
}
Validator を手動で使う場合
Validator::make() で自分で判定するときは、withInput() を付けないと入力値がフラッシュされず、old() が空になります。
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'url' => ['required', 'url'],
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput(); // これがないと old() が空になる
}
バリデーション以外の理由(外部 API エラーなど)で入力画面に戻すときも、同じく ->withInput() を付ければ値を保持できます。一部だけ戻したいときは withInput($request->except('card_number')) のように指定します。
入力部品ごとの書き方
テキストエリア
<textarea name="body">{{ old('body') }}</textarea>
編集画面(DB の値を初期表示)
<input type="text" name="title" value="{{ old('title', $bookmark->title) }}">
セレクトボックス
<select name="category">
@foreach ($categories as $category)
<option value="{{ $category->id }}" @selected(old('category', $bookmark->category_id) == $category->id)>
{{ $category->name }}
</option>
@endforeach
</select>
チェックボックス・ラジオボタン
<input type="checkbox" name="public" value="1" @checked(old('public', $bookmark->public))>
<input type="radio" name="type" value="a" @checked(old('type') === 'a')>
<input type="radio" name="type" value="b" @checked(old('type') === 'b')>
@checked / @selected ディレクティブは Laravel 9 以降で使えます。それより前のバージョンでは {{ old('public') ? 'checked' : '' }} のように書きます。
配列形式の入力
name="tags[]" や name="items[0][name]" のような配列入力は、ドット記法で取り出します。
<input type="text" name="items[0][name]" value="{{ old('items.0.name') }}">
エラーメッセージと一緒に表示する
<input type="url" name="url" value="{{ old('url') }}"
class="@error('url') is-invalid @enderror">
@error('url')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
old() が効かないときの原因
- name 属性と old のキーが違う:
name="user_name"なのにold('name')になっているなど - セッションが使えないルート:
routes/api.phpのルートには web ミドルウェアグループ(セッション)が適用されないため、フラッシュされない - 手動 Validator で
withInput()を付けていない - リダイレクトせずに view を返している: 失敗時に
return view(...)するとフラッシュデータは次のリクエスト用なので、その画面では読めない - パスワード項目:
password、password_confirmation、current_passwordは安全のため既定でフラッシュ対象外。再入力してもらう仕様が正しい - 空欄にした値が初期値に戻る: Laravel は空文字を null に変換するミドルウェアが既定で有効なため、編集画面で項目を空にして他の項目でエラーになると、
old('title', $bookmark->title)が DB の値を表示することがある
確認方法
フラッシュされた値が実際にあるかは、リダイレクト先のビューやコントローラで確認できます。
dd(session()->getOldInput()); // フラッシュされた全入力値
dd($errors->all()); // Blade 内で利用できるエラー一覧
わざと不正な値を送信し、エラーメッセージが表示され、かつ入力欄に送信した値が残っていれば正しく動作しています。
関連
- Laravel の csrf_field の使い方
- Laravel Blade @if 条件分岐の使い方完全ガイド
- Laravel「The page has expired due to inactivity」の原因と対処(CSRF / セッション切れ)
- HTML input要素の使い方|type一覧・必須属性・バリデーション
子ページはありません
- 入力データの保持
- 必須チェック
- 文字列の長さチェック
- 存在チェック
- 一意チェック
- 日本語化
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38