Laravel7 Postで遷移した入力フォームでバリデーションエラー時の’The GET method is not supported for this route. Supported methods: POST. ‘の対処法

Getで入力フォームに遷移し、フォーム入力してPostしてバリデーションエラーがあれば再度入力フォームを表示し、エラーがなければDBに登録して完了!のような流れはとても簡単に実装できる。

しかし、STEP1~4 + 確認ページのような入力フォームが複数のページに跨るような構成だとSTEP2以降の入力フォームはPostされて遷移した入力フォームになる。

それがなぜ問題になるかというと、バリデーションエラー発生時は、「1つ前のリクエストをGetにしてリクエストされる」からである。
※よく、同じblade(view)が表示されると思われがちだが、そうではない!!

もし、バリデートの必要がなく、「戻る」ボタンもないなら、STEP2~4のルーティングはPostだけを用意すればよい。しかし、全ての入力フォームでバリデートが必要な場合は、STEP2~4にもGetのルーティングを用意しなければならない。表題のエラーメッセージを解決するにはこれで解決だけど、正しく動作させるには実際はもっと面倒である。
エラーとなる1つ前のリクエストをGetにしての部分である。Getになってしまうので1つ前のフォームからは入力値は受け取れないのでPost時と処理を分けるなりする必要がある。更に単純に1つ前のフォームに戻りたくて「Get」リクエストされる場合もある。

例えば
フォーム1から2にPostされて3にPostされた時にバリデーションエラーが発生した場合は
フォーム1から2のPostがフォーム1から2のGetとしてリクエストされる。
しかし
フォーム2から3に正常に遷移し、「戻る」ボタンでフォーム2に戻って3へのPostでバリデーションエラーが発生した場合は
フォーム3から2へのGetとしてリクエストされる。

作りにもよるが、PostとGetで処理を分け、更にGetでもバリデーションエラー時と「戻る」ボタン押下時で分ける必要がある。
更にGetでは、前のSTEPのPost値は取得出来ないのでセッションを上手に使う必要がある。

結果、Getのルートを用意すれば表題の問題は解決されるが、それだけではWebサイトは正常動作しないと思われ、きちんと設計が必要だということになる!!

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です