Laravel

【Laravel】oldヘルパーまとめ【フォーム入力値の保持】

Laravelにはoldというフォームの入力値を保持して簡単に利用するための仕組みがあります。

oldとは

Requestクラスを設定してバリデーションで弾かれた場合など、バリデーションエラーとなってフォームの画面へ戻されます。
このとき、そのままであればフォームの入力値はすべてリセットされてしまい、ユーザーはまた入力をしなければいけない...
それを防ぐための実装を簡単にできるのがoldヘルパーです。

bladeテンプレート上で{{ old('name') }}とするだけでnameの入力値が取れます。
下記のように使います。

<input type="text" name="title" value="{{ old('title') }}">

また、初期値を入れたい場合は第2引数を設定することで可能です。
下記の場合はtitleパラメータの入力値があればそれが入り、なければdefaultという文字が初期値として入ります。

<input type="text" name="title" value="{{ old('title', 'default') }}">

リダイレクト時に保持する

oldはセッションのflashメソッドを利用しており、1回遷移した先でしか使えずその後削除されます。
エラー時のリダイレクトをする場合、そのままではoldに入力値が保持されません。
->withInput() を使ってoldの入力値を遷移先に渡しましょう。

使い方の例は下記です。

return redirect()
   ->route('example.form.input', ['param1' => 'abc', 'param2' => 'def'])
   ->withErrors(['error' => $error_message])
   ->withInput();

任意で追加する(非推奨)

sessionのflashメソッドを使っているのでどうしてもであれば下記手順で任意に追加できます。

$request->session()->flash('_old_input', ['key' => 'value']);

ただし、これは完全に間違ったやり方であり、old本来の動作から外れるので不具合やメンテ効率低下の原因となります。
何らかの理由で緊急でこの方法で済ませたとしても、後でリファクタしておきましょう。

まとめ

いかがだったでしょうか。
oldはうまく使うとフォーム周りのUX向上を効率よく実装できます。

参考:
https://laravel.com/docs/8.x/validation
https://readouble.com/laravel/8.x/ja/validation.html (日本語)

-Laravel