開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. [Laravel 5.1]リクエストを跨がず即座にold inputをテンプレートで利用する
no-image

[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',
        ]);

ただ、実装の詳細に依存してしまうのであちらを立てればこちらが立たずという感じです。

TOPに戻る