[Laravel 5.1]リクエストを跨がず即座にold inputをテンプレートで利用する
こんにちは、ナカエです。
Laravelにはフォームへの入力を次のリクエストまで保持する機能が用意されています。
フォームの送信時に入力エラーがあり、リダイレクトで元のフォームに戻す場合によく利用します。
参考:https://laravel.com/docs/5.1/requests#old-input
コントローラのアクションで
return redirect()->to('hoge')->withInput();
としておけば、リダイレクト先の次のリクエストの処理において、 Requestクラスのold()メソッド、ヘルパ関数のold()などから 古い入力を参照することができ、非常に便利です。
テンプレートで即座に使いたい
レスポンスを跨いだ次のリクエスト時ではなく、同じリクエストのテンプレートをレンダリングするタイミングでold inputが使えたらなあと思う場面がたまにあります。
例えば、old()ヘルパを利用して新規作成と編集フォームを同じテンプレートにしたいケースです。
※フォームのデフォルト値をビュー変数として渡す方がわかりやすい設計だとは思いますが……。
実現方法
Sessionファサード(実体は\Illuminate\Session\Store) を利用して古い入力がある状態を擬似的に再現します。
●コントローラのアクション
public function edit()
{
//古い入力として扱いたいデータ
$oldData = [
'name' => '田中太郎',
//
];
//セッションにold inputとして保存
\Session::flashInput($oldData);
$view = view('edit', [
'hoge' => 'fuga',
]);
//bodyをold inputが有効な状態で先に出力
$content = $view->render();
//old inputを空にする
\Session::flashInput([]);
//HTTPレスポンスを返す
return response($content);
}
追記
Larval 5.1.26で \Illuminate\Session\Store::now() というメソッドが追加されています。
第一引数を'_old_input’としてこちらを利用すれば、 ビューをレンダリングした後にold inputのセッションのお掃除をする手間は省けます。
\Session::now('_old_input', $oldData);
return view('edit', [
'höge' => 'fuga',
]);
ただ、実装の詳細に依存してしまうのであちらを立てればこちらが立たずという感じです。