質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

Laravel 2ページに渡って入力フォームがある場合のバリデーションとリダイレクト処理について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 237

ppphysiccc

score 18

お世話になっております。

表題の通りなのですが、Laravelで

情報入力ページ → 画像アップロード画面 → 確認画面 → 完了画面

という4つのページを作成しています。
バリデーションはFormRequestを使っていて、Controllerの引数にTestFormRequest $requestとして機能させています。

1.情報入力ページへはURLでのアクセスで http://aaa.com/?test=123 のような形でアクセスし、
testの値によってバリデーションをかけています。test= のように消したら「見つからない」、 test=aaaaaのように文字列にしたら「不正」と出しています。
時々URLを直接実行するとtestがないとバリデーションに引っかかるときがあります。リロードすると治ります。
入力ページには名前とメールアドレスの入力フォームがあり、必要項目を入力するとボタンが表示されてpostで画像アップロード画面へデータを送信します。

  1. 名前とメールアドレスのバリデートはここで実行していて、もし不備があれば一つ前のページにリダイレクトされます。
    FormRequestの機能で自動的にwithErrorsとwithInputが生成され、自動的に1つ前のページに戻るようになっています。

  2. 問題がなければ画像をアップロードフォームが表示され、同じくバリデートでjpegやgif,pngを判定して、確認画面へ飛びます。
    pdfをアップロードしたり、画像以外をアップしたり、問題があれば、1つ前の「画像アップロード画面」へリダイレクトし、再度画像の選択を促します。

しかし、画像アップロード画面へリダイレクトされた時点で、POSTデータが消えてしまうので、バリデートを行うデータが空になってしまって続けてバリデートエラー、
さらに「前のページ」にリダイレクトするがPOSTデータが空なのでバリデートエラー。また確認ページへ飛び、リダイレクトしてアップロード画面へ…
の繰り返しで無限ループになってしまいます。

POSTデータを受け渡そうとしてSession::putなどを使ったりしていますが、storage/framework/session以下に作られるデータを見ても、中に登録したデータが書き込まれておらず、結局更新したらデータが消えてしまったりします。

上記のようなページではどのように構成するとよいでしょうか?
少しややこしいので以下に質問内容をまとめさせていただきます。

☆時々URLを実行すると「testがない」とバリデーションに引っかかるときがあるのはなぜ?リロードすると直る。
☆リダイレクトしてもデータをやり取りするには?

情報の過不足があれば追記させていただきますので、ご教示お願い致します。

追記:
新たに作成したFormRequestクラスに以下を追加して、大元のFormRequestのvalidationDataを上書きし、
このようにしてみました。
$this->all()にバリデーションデータが入っており、これをrules等のその後の処理に送るそうなので、ここで空になっているかどうかをチェックし、
リダイレクト前のページで格納したwithInputをSession::get('_old_input');で取得してみました。

    protected function validationData()
    {
        $data = $this->all();

        if(empty($data)){
            $data = Session::get('_old_input');

            if($data === null){
                $data = [];
            }
        }
   }


こちらだとリダイレクトされたばかりの状態だと挙動としては問題なさそうでした。
しかし、1回目だけ問題ない状態で、この状態でリロードするとSessionからもデータが消えてしまうので
データを取ることができず、だめでした。
引き続き回答をお待ちしております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

上記のvalidationDataに

        $data = $this->all();
        if(empty($data)){
            $data = Session::get('_old_input');
            if($data === null){
                $data = Session::get('aaaaaaa');
            }else {
                Session::put('aaaaaaa', $data);
                Session::save();
            }
        }

コントローラ側で

$_request = $request->validated();


として受け取ったところ動くようになりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • Laravel 2ページに渡って入力フォームがある場合のバリデーションとリダイレクト処理について