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

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

ただいまの
回答率

88.62%

The GET method is not supported for this route. Supported methods: POST.

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,915

jiro-

score 28

前提・実現したいこと

Laravel -v 5.8.35で会員登録フォーム確認画面から、送信完了画面へ移動する際、入力内容修正、この内容で問い合わせるボタンを押すと以下のエラーメッセージが発生しました。ご教示よろしくお願い致します。

発生している問題・エラーメッセージ

MethodNotAllowedHttpException
The GET method is not supported for this route. Supported methods: POST.

該当のソースコード

原因のページ views/auth/register_confirm

@section('title', '会員登録確認')

@section('content')
      <form method="post" action="{{ action('Auth\RegisterController@complete') }}">
          @csrf

          <label>お名前</label>
          {{ $inputs2['name'] }}
          <input name="name" type="hidden" value="{{ $inputs2['name']}}">

          <!-- 省略 -->

          <input type="submit" name="action" value="back">
              入力内容修正
          <input type="submit" name="action" value="submit">
              この内容で問い合わせる
      </form>
@endsection


views/auth/register_complete

@extends('layouts.layout')

@title('会員登録完了')

@section('content')
<h1>{{ __('送信完了しました') }}</h1>
@endsection


App/Http/controllers/RegisterController

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    use RegistersUsers;
    protected $redirectTo = '/';
    public function __construct()   
    {                               
        $this->middleware('guest'); 
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'kname' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'gender' => 'required',
            'birthday' => ['required', 'integer',],
            'phone_num' => ['required', 'integer'],
            'postal_code' => 'required',
            'prefectures_name' => ['required', 'string', 'max:255'],
            'city' => ['required', 'string', 'max:255'],
            'subsequent_address' => ['required', 'string', 'max:255']
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'reading' => $data['reading'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'gender' => $data['gender'],
            'birthday' => $data['birthday'],
            'phone_num' => $data['phone_num'],
            'postal_code' => $data['postal_code'],
            'prefectures_name' => $data['prefectures_name'],
            'city' => $data['city'],
            'subsequent_address' => $data['subsequent_address']
        ]);
    }

    //会員登録確認画面へ移動するactionです
    public function confirm(Request $request)
    {
        $inputs2 = $request->all();
        return view('auth/register_confirm', ['inputs2' => $inputs2]);
    }

    //会員登録完了画面or入力内容修正画面に戻るへ移動するactionです
    public function complete(Request $request)
    {
        \Debugbar::info("test");
        $this->validate($request,[
            'name' => 'required',
            'kname' => 'required',
            'email' => 'required',
            'password' => 'required',
            'gender' => 'required',
            'birthday' => 'required',
            'phone' => 'required',
            'postal_code' => 'required',
            'prefectures_name' => 'required',
            'city' => 'required',
            'subsequent_address' => 'required'
        ]);

        $action = $request->get('action', 'back');
        $inputs2 = $request->except('action');

        \Debugbar::info($inputs2);
        if($action === 'post') {
            \Mail::to($inputs2["email"])->send(new RegisterSendmail($inputs2));
            $request->session()->regenerateToken();

            return view('auth/register_complete');
        } else {
            return redirect()
                   ->route('register')
                   ->withInput($inputs2);
        }
    }
}


web.php

➀Route::post('register/confirm', 'Auth\RegisterController@confirm')->name('register_confirm');
➁Route::post('register/complete', 'Auth\RegisterController@complete')->name('register_complete');

試したこと

1⃣上記web.phpの➁をmatchメソッドを使用しpost,get両方取得できるようにして実行
Route::match(['get', 'post'], 'register/complete', 'Auth\RegisterController@complete')->name('register_complete');
ターミナルでphp artisan route:listでルーティング確認し
|  | GET|POST|HEAD | register/complete | register_complete | App\Http\Controllers\Auth\RegisterController@complete | web,guest
getもpostも取得できています             
結果:同エラー

2⃣Route::get('register/complete', 'Auth\RegisterController@complete')->name('register_complete');
結果:同エラー

3⃣view側methodはpostのままで実行                                                      
errorページのURLはhttp様表示/register/complete?afwhfoawhoh        結果:同エラー

4⃣view側methodをgetで実行                                                          
errorページのURLはhttps様表示/register/complete        結果:同エラー

5⃣view側methodを['get', 'post']で実行       結果:同エラー

6⃣viewのform内の@csrfを削除       結果:419エラー

7⃣register.blade.php中のactionを2通り実行
<form action="{{ route('register_confirm')}}">
<form action="{{ action('Auth\RegisterController@complete') }}">   結果:同エラー

8⃣register.blade.php中の<input type="submit">を<button type="submit">に変えて実行      結果:同エラー

9⃣以前、cartitemを作っている時に同様のエラーが起こり、その時は/addを下記のように追加してあげるとなぜか解決しました。
Route::post('/cartitem/add', 'CartItemController@store')->name('cartitem');
view側もaction="{{ route('/cartitem/add') }}
今回register_confirm/adと同様の事をしましたがエラー直らず

*試していないが、参考にさせて頂いたページにapp/Exceptions/Handler.phpのrenderメソッドをif文でMethodNotAllowedHttpExceptionエラーが起こった時に別ページにredirect処理でとりあえず戻れるとあります。
今回それを使用せず解決したいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

バリデーションに引っかかって内部でエラーを返している際にGET送信されてるきがします

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/18 16:41

    ご回答ありがとうございます。
    おっしゃる通りcontrollerのcompleteアクションのバリデーションをコメントアウトしてみるとエラー起こらず進めました。

    質問違いになってしまうかもしれないのですが、バリデーションは必要だと思うのですがコードの書き方が悪いのでしょうか?

    キャンセル

  • 2019/10/18 16:47 編集

    んーそのあたりはFormRequestクラスを使えばいいのかなーと(自分も経験あるのですが解決策をすぐに思い出せず・・・)
    まあ確認画面を得ているということは値の検証ができてるので、そこでバリデーションチェックで引っかかるなら強制的に入力画面へリダイレクトさせてもいい気もします(できればほかの値は保持したままで)

    キャンセル

  • 2019/10/18 16:52

    ご丁寧にありがとうございます。
    FormRequestクラスを使ってみるのと、バリデーション引っかかったら強制的に入力画面へリダイレクト(できればほかの値は保持したままで)も試してみて実装できそうならやってみます。
    大変助かりましたm(__)m

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る