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つのリクエストとリスポンスからなります。

  1. GETのリクエストで空の入力画面が表示されます。

  2. 次に、不正なEmailの値を入れて、「Register」のボタンを押すとPOSTのリクエストでサーバー、つまりLaravelのコントローラに送信されます。
  3. そこのバリデーションでエラーが起こると(つまりメールアドレスのフォーマットではない)、入力した値とエラーを表示するために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があり、これらは次のリクエストで利用できることを示しています。

By khino