Laravelのブレードファイルでよく見かける、old()ヘルパー。エラーが起こった時に入力した値をキープしてエラーとともに入力項目に残してくれる優れものです。今回はこの仕組みを見てみます。
ブレードファイル
old()ヘルパーはブレードファイルに使われます。以下は、Laravelのデフォルトの認証に使用されるブレードのファイルの一部をとってきました。
... <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label> <div class="col-md-6"> <input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email"> @error('email') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> ...
inputのHTML文で、value="{{ old('email') }}"
にヘルパーが使われていますね。
このために、以下のようにエラーが起こると、入力した値が再表示されます(ここでは、デモののためにtype=”email”ではなく、type=”text”としています)。
リクエストの流れ
エラーが出力するまでのリクエストの流れをたどってみると、以下の3つのリクエストとリスポンスからなります。
-
GETのリクエストで空の入力画面が表示されます。
- 次に、不正なEmailの値を入れて、「Register」のボタンを押すとPOSTのリクエストでサーバー、つまりLaravelのコントローラに送信されます。
- そこのバリデーションでエラーが起こると(つまりメールアドレスのフォーマットではない)、入力した値とエラーを表示するためにGETのリクエストで以下の画面となります。
さて、どうやってLaravelはPOSTした入力値を次のGETで表示される画面に出力しているのでしょう?
Laravelはこの目的のためにセッションを利用しています。上の2番目のPOSTのリクエストでセッションに入力値を保存して、次のGETのリクエストのときに、セッションから取り出します。このセッションの保存は特別で、使用は次のリクエストのみです。それゆえに同じ画面を手動でリフレッシュすると上の1の空の入力の画面となります。
デバッグバー
ここ実際のセッションの状態がどう遷移するか見てみたいですね。
そこで登場するのがデバッグバーのパッケージです。
以下でインストールできます。
$ composer require barryvdh/laravel-debugbar --dev
デバッグバーをインストールして、同じ画面でエラーを発生させると、以下のように画面下で実行したDBクエリーやセッションなどの情報を見ることできます。
赤の矢印の部分をクリックすると、セッションの情報が表示されます。あれれ、old()の値となるセッション項目は空ですね。おかしいかなと思いきや、この画面は、流れの3番目の画面を表示後の段階で、もう保存した値はセッションにはないのです。その前のPOSTのの直後のセッションの値を見る必要あります。
POSTへ戻るには、青箱のフォルダーアイコンをクリックします。そこでポップアップ表示される以下のダイアログにおいて、POSTの行をクリックします。
以下がPOSTの直後でのセッションの値です。見ての通りに、_old_inputには入力された値、errorsにはエラーのデータが保存されています。さらに、_flashの配列には、oldとして_old_inputとerrorsがあり、これらは次のリクエストで利用できることを示しています。
メルマガ購読の申し込みはこちらから。