はじめに
以前Laravlを使った時に、フォーム入力後の遷移したページに「入力をやり直す」ボタンを置いて、それを押したらフォーム入力欄に入力値が入力された状態で戻して欲しいと言われました。
何となく簡単そう・・・ではなかった。。。
意外と難しかったので、(ベストな方法ではないかもしれないですが)それについて書きます。
良い方法があれば知りたいのでコメントで教えて下さい!
実現したいこと
①ページAで、フォームを入力してそれをpostする
②ページB(確認画面)で「(入力を)やり直す」ボタンを押す
③入力値が保持された状態でページAへ遷移する
(バリデーションエラーの時のような挙動です!)
結論
下記の方法で、一時的に入力値を保持することができます。
①セッションの_old_inputに入力値を保存する
$request->session()->flash('_old_input',[
'hoge' => $hoge,
'fuga' => $fuga,
]);
return redirect()->route('pageA');
②ページAでoldヘルパーを使って取得する。
<input name="hoge" type="text" value="{{ old('hoge') }}">
少し解説
どうやって実現しているかというと、Laravelのoldヘルパーとvalidationの仕組みを利用しました!
(oldヘルパーを利用するとバリデーションエラーになったときに、フォームの値を保持してくれます)
説明のために、oldヘルパーとバリデーションについて少し触れておきます。
oldヘルパーとバリデーションの仕組み(簡易版)
まず、bladeファイル側で、バリデーションエラーになったときに、値を保持しておきたい項目のvalue属性に「name属性の値」と同じ引数を渡して設定します。
<input type="text" name="hoge" value="{{ old('hoge') }}" >
<input type="text" name="fuga" value="{{ old('fuga') }}" >
上記のように書いて、Laravelのコントローラーにリクエストしてバリデーションエラーとなった場合、
セッションの”_old_input”という項目にリクエストした値が、「name属性の値」で入っています。そしてリクエストがあった画面へ戻されます。
その値をoldヘルパーの引数に「name属性の値」を設定することで取得することができます。
因みにblade側でこんな感じで_old_inputを取得出来ると思います。
session()->get('_old_input')
今回どのように乗り切ったか
blade側で、フォームにoldヘルパーを書きます。
まずページAからpostされたタイミングで、コントローラー内で入力値をセッションに保存しておきます。
$request->session()->put([
'hoge' => $request->hoge,
]);
もし、ページB内で「入力からやり直す」ボタンを押した時は、(コントローラー側で)_old_inputに先程セッションに保存した値を保存してページAに遷移させます。
$request->session()->flash('_old_input',[
'hoge' => $request->session()->get('hoge')
]);
return redirect()->route('pageA');
もし、ページB内で「確定して送信」ボタンを押したときは、(コントローラー側で)セッションに保存されているフォームの入力値を削除します。
$request->session()->forget('hoge');
$request->session()->save();
最後に
Laravelの知見が浅く、ベストな方法ではないと思うので、より良い方法があれば是非コメントで教えて下さい。