Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravel8]The GET method is not supported for this route. Supported methods: POST.の原因と解決策知りたい。

[Laravel8]The GET method is not supported for this route. Supported methods: POST.の原因と解決策知りたい。

Qiitq初投稿の未経験エンジニアです。質問の仕方に不備がありましたら申し訳ありません。
現在Laravel8でECサイトを製作中です。
お問合せフォームを実装中に上記のエラーが出てしまいます。
どなたか解決方法を教えていただけると助かります。

お問合せフォーム→確認画面→メール送信→送信完了画面という実装になっています。
確認画面までは表示できており、送信ボタンを押すと上記のエラーが出ます。

確認画面から送信ボタンを押すとエラー表示

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

該当するソースコード

routes/web.php
Route::prefix('contact')->middleware('auth:users')->group(function(){
    Route::get('/', [ContactController::class, 'index'])->name('contact.index');
    Route::post('confirm', [ContactController::class, 'confirm'])->name('contact.confirm');
    Route::post('thanks', [ContactController::class, 'send'])->name('contact.send');
});
app/Http/Controllers/User/ContactController.php
<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use App\Mail\ContactSendmail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;


class ContactController extends Controller
{

/**
 * お問合せ画面表示
 * 
 * @return Illuminate\Support\Facades\View
 */
    public function index()
    {
        return view('user.contact.index');
    }

/**
 * お問合せ内容確認画面表示
 * 
 * @param Request $request
 * @return Illuminate\Support\Facades\View
 */
    public function confirm(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email',
            'title' => 'required',
            'contact'  => 'required',
        ]);

        $inputs = $request->all();


        return view('user.contact.confirm',
        compact('inputs'));
    }

/**
 * thanksメール送信機能表示
 * 
 * @param Request $request
 * @return Illuminate\Support\Facades\View
 */
    public function send(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email',
            'title' => 'required',
            'contact'  => 'required',
        ]);

        $action = $request->input('action');

        $inputs = $request->except('action');
        dd($inputs);


        if($action !== 'submit'){
            return redirect()
                ->route('user.contact.index')
                ->withInput($inputs);

        } else {
            Mail::to($inputs['email'])->send(new ContactSendmail($inputs));

            $request->session()->regenerateToken();

            return view('user.contact.thanks');

        }
    }
}

resources/views/user/contact/index.blade.php
<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            お問い合わせ
        </h2>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 bg-white border-b border-gray-200">
                    <form method="POST" action="{{ route('user.contact.confirm') }}">
                        @csrf

                        <!-- Name -->
                        <div>
                            <x-label for="name" :value="__('名前')" />

                            <x-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus />
                            @if ($errors->has('name'))
                                <p class="error-message">{{ $errors->first('name') }}</p>
                            @endif
                        </div>

                        <!-- Email Address -->
                        <div class="mt-4">
                            <x-label for="email" :value="__('メールアドレス')" />

                            <x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required />
                            @if ($errors->has('email'))
                                <p class="error-message">{{ $errors->first('email') }}</p>
                            @endif
                        </div>

                        <div class="mt-4">
                            <x-label for="title" :value="__('タイトル')" />

                            <x-input id="title" class="block mt-1 w-full" type="text" name="title" :value="old('title')" required />
                            @if ($errors->has('title'))
                                <p class="error-message">{{ $errors->first('title') }}</p>
                            @endif
                        </div>

                        <!-- contact -->
                        <div class="mt-4">
                            <x-label for="contact" :value="__('お問い合わせ内容')" />

                            <x-textarea id="contact" class="block mt-1 w-full" type="text" name="contact" :value="old('contact')" required />
                            @if ($errors->has('contact'))
                                <p class="error-message">{{ $errors->first('contact') }}</p>
                            @endif
                        </div>

                        <div class="flex items-center justify-end mt-4">
                            <x-button class="ml-4">
                                {{ __('送信') }}
                            </x-button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</x-app-layout>

resources/views/user/contact/confirm.blade.php
<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            お問い合わせ内容確認
        </h2>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 bg-white border-b border-gray-200">
                    <form method="POST" action="{{ route('user.contact.send') }}">
                        @csrf
                        <div>
                            <x-label for="name" :value="__('名前')" />
                            {{ $inputs['name'] }}
                            <x-input id="name" class="block mt-1 w-full" type="hidden" name="name" :value={{ $inputs['name'] }} />
                        </div>
                        <div class="mt-4">
                            <x-label for="email" :value="__('メールアドレス')" />
                            {{ $inputs['email'] }}
                            <x-input id="email" class="block mt-1 w-full" type="hidden" name="email" :value={{ $inputs['email'] }} />
                        </div>
                        <div class="mt-4">
                            <x-label for="title" :value="__('タイトル')" />
                            {{ $inputs['title'] }}
                            <x-input id="title" class="block mt-1 w-full" type="hidden" name="title" :value={{ $inputs['title'] }} />
                        </div>
                        <div class="mt-4">
                            <x-label for="contact" :value="__('お問い合わせ内容')" />
                            {{ $inputs['contact'] }}
                            <x-input id="contact" class="block mt-1 w-full" type="hidden" name="contact" :value={{ $inputs['contact'] }} />
                        </div>
                        <div class="flex items-center justify-end mt-4">
                            <x-button class="ml-4" value="back" type="button" onclick="location.href='{{ route('user.contact.index')}}'">
                                {{ __('入力画面に戻る') }}
                            </x-button>
                            <x-button class="ml-4">
                                {{ __('送信') }}
                            </x-button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</x-app-layout>

自分で試したこと

キャッシュ等のクリア

php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

0

2Answer

confirm.blade.php の

<x-input id="name"  :value={{ $inputs['name'] }} />

<x-input id="name"  :value="$inputs['name']" />

にしてください。他の x-input についても同様に :value="$inputs[...]" に直してください。これで確認画面の送信ボタンを押してもエラーは出なくなります。

もう一つ、ボタンを押してもメールが送信されない問題があります。これは ContactController::send()

$action = $request->input('action');

が null になるためにその下の分岐でメール送信に進まないからです。 action パラメータは渡されていないのでここと分岐を消せばよさそうです。


参考までに調査の流れを書いておきます。

まず https://github.com/kalpee/ECshop をクローンして ContactController に以下のログメッセージを仕込みました。

diff --git a/app/Http/Controllers/User/ContactController.php b/app/Http/Controllers/User/ContactController.php
index a336f60..6905b32 100644
--- a/app/Http/Controllers/User/ContactController.php
+++ b/app/Http/Controllers/User/ContactController.php
@@ -7,6 +7,8 @@ use App\Mail\ContactSendmail;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Mail;
 
+use Illuminate\Support\Facades\Log;
+
 
 class ContactController extends Controller
 {
@@ -38,6 +40,7 @@ class ContactController extends Controller
 
         $inputs = $request->all();
 
+        Log::error('confirm');
 
         return view('user.contact.confirm',
         compact('inputs'));
@@ -51,6 +54,8 @@ class ContactController extends Controller
  */
     public function send(Request $request)
     {
+        Log::error("send - before validate");
+
         $request->validate([
             'name' => 'required',
             'email' => 'required|email',
@@ -58,18 +63,21 @@ class ContactController extends Controller
             'contact'  => 'required',
         ]);
 
+        Log::error("send - after validate");
+
         $action = $request->input('action');
         
         $inputs = $request->except('action');
-        dd($inputs);
 
 
         if($action !== 'submit'){
+            Log::error("send - redirect");
             return redirect()
                 ->route('user.contact.index')
                 ->withInput($inputs);
 
         } else {
+            Log::error("send - send mail");
             Mail::to($inputs['email'])->send(new ContactSendmail($inputs));
 
             $request->session()->regenerateToken();

送信ボタンを押して storage/logs/laravel.log を見ると、 send - before validate までログに出た後でエラー画面が表示されることが分かりました。ということは、 $request->validate(...) のバリデーションが通っていないようです。

バリデーションが通らないと同じページ(ここでは /contact/confirm)にリダイレクトされます。リダイレクトでは GET リクエストになりますが、 /contact/confirm は POST にしか対応していないのでエラーになりそうです。これはエラー画面の内容とも一致します。

バリデーションが通っていないということはパラメータの送信がうまくいっていない可能性があります。再度お問い合わせ画面から確認画面に移動し、ページのソースを表示しました。フォームに <input> タグがあるべきところ、 <x-input> タグが存在しました。 <x-input> タグはサーバ側で Blade によって <input> タグに置き換わるはずですがそうなっていません。

<x-input> タグの構文エラーがないか確認したところ、 :value=... の書き方が間違っているのを見つけました。

0Like

Comments

  1. @kalpee-sho

    Questioner

    すごく丁寧で分かりやすい解説ありがとうございます。
    ご指摘通り、訂正したら無事にメール送信が行えました!
    調査の流れまで教えて頂き助かりました。
    ありがとうございました!

blade-ui-kitかlaravel-form-componentsを使ってますのか?
問題はbuttonのtypeがsubmitじゃ無いからだと思います。

0Like

Comments

  1. @kalpee-sho

    Questioner

    コメントありがとうございます。
    inputのvalueの書き方が違いました。

Your answer might help someone💌