🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

4885閲覧

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

Tony-Aaron

総合スコア22

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

0グッド

0クリップ

投稿2021/02/18 15:24

前提・実現したいこと

現在、簡単なお問い合わせフォームを作成しています。

お問い合わせ入力ページ⇨確認画面⇨送信完了という順にページを作成しています。
確認画面から送信する際にエラーが発生しています。
こちらのURLを参考にしています

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

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

エラー文のスクショです

該当のソースコード

web.php <?php Route::get('/', function () { return view('welcome'); }); Route::get('/home', 'HomeController@index')->name('home'); //お問い合わせの送信メールのルーティング Route::get('/contact/index', 'ContactController@index')->name('contact.index'); Route::post('/contact/confirm', 'ContactController@confirm')->name('contact.confirm'); Route::post('/contact/complete', 'ContactController@send')->name('contact.send');
ContactController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Mail\ContactSendmail; class ContactController extends Controller { public function index() { //フォーム入力画ページのviewを表示 return view('contact.index'); } public function confirm(Request $request) { //バリデーションを実行(結果に問題があれば処理を中断してエラーを返す) $request->validate([ 'email' => 'required|email', 'title' => 'required', 'body' => 'required', ]); //フォームから受け取ったすべてのinputの値を取得 $inputs = $request->all(); //入力内容確認ページのviewに変数を渡して表示 return view('contact.confirm', [ 'inputs' => $inputs, ]); // dd($inputs); } public function send(Request $request) { //バリデーションを実行(結果に問題があれば処理を中断してエラーを返す) $request->validate([ 'email' => 'required|email', 'title' => 'required', 'body' => 'required' ]); //フォームから受け取ったactionの値を取得 $action = $request->input('action'); //フォームから受け取ったactionを除いたinputの値を取得 $inputs = $request->except('action'); //actionの値で分岐 if($action !== 'submit'){ return redirect() ->route('contact.index') ->withInput($inputs); } else { //入力されたメールアドレスにメールを送信 \Mail::to($inputs['email'])->send(new ContactSendmail($inputs)); //再送信を防ぐためにトークンを再発行 $request->session()->regenerateToken(); //送信完了ページのviewを表示 return view('contact.complete'); } } }
ContactSendmail.php <?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class ContactSendmail extends Mailable { use Queueable, SerializesModels; private $email; private $title; private $body; /** * Create a new message instance. * * @return void */ public function __construct( $inputs ) { $this->email = $inputs['email']; $this->title = $inputs['title']; $this->body = $inputs['body']; } /** * Build the message. * * @return $this */ public function build() { return $this ->from('example@gmail.com') ->subject('自動送信メール') ->view('contact.mail') ->with([ 'email' => $this->email, 'title' => $this->title, 'body' => $this->body, ]); } }
@extends('layouts.app') @section('content') {{-- 入力に問題が無かったら次のコントローラーに送る際のルーティングを設定 --}} <form method="POST" action="{{ route('contact.confirm') }}"> {{-- 入力するフォームにはcrsf対策をする。無ければ419というエラーが出る --}} @csrf <div class="container"> <div class="panel-default w-75 mx-auto card mt-5"> <div class="panel-heading h2 p-3 text-center bg-primary text-white">お問い合わせフォーム</div> <div class="panel-body"> <!-- //hasは入力値の存在チェック 特定のエラーの取得 {{ $errors->first('username') }} (※配列形式で結果が返ってくるため、first()で最初のものを取得している。) エラーの存在チェック {{ $errors->has('username') }}firstはクエリビルダーのことで無ければ空白というエラーを出す--> <div class="form-group"> <div class="my-3 mx-auto col-md-7"> <label for="inputTitle">メールアドレス</label> <input type="text" class="form-control @if($errors->has('email')) is-invalid @endif" placeholder="メールアドレスを入力して下さい" name="email" value="{{ old('email') }}"> @if ($errors->has('email')) <p class="error-message invalid-feedback">{{ $errors->first('email') }}</p> @endif </div> </div> <div class="form-group"> <div class="my-3 mx-auto col-md-7 col-md-offset-5"> <label for="inputTitle">件名</label> <input type="text" class="form-control @if($errors->has('title')) is-invalid @endif" placeholder="件名を入力して下さい" name="title" value="{{ old('title') }}"> @if ($errors->has('title')) <p class="error-message invalid-feedback">{{ $errors->first('title') }}</p> @endif </div> </div> <div class="form-group"> <div class="my-3 mx-auto col-md-7 col-md-offset-5"> <label for="inputTitle">本文入力</label> <textarea rows="7" class="form-control mb-4 @if($errors->has('body')) is-invalid @endif" placeholder="本文を入力して下さい" name="body" >{{ old('body') }}</textarea> @if ($errors->has('body')) <p class="error-message invalid-feedback">{{ $errors->first('body') }}</p> @endif <div class="form-group row mt-5 justify-content-around"> <input type="submit" class="btn bg-primary text-white btn-lg" value="投稿内容を送信" /> <input type="reset" class="btn bg-danger text-white" value="リセット" /> </div> </div> </div> </div> </div> </form> @endsection
confirm.blade.php @extends('layouts.app') @section('content') <form method="POST" action="{{ route('contact.send') }}"> //こちらがエラー箇所になります。 @csrf <div class="container"> <div class="panel-default w-75 mx-auto card mt-5"> <div class="panel-heading h2 p-3 text-center bg-primary text-white">お問い合わせフォーム 確認画面</div> <div class="panel-body"> <div class="form-group"> <div class="my-3 mx-auto col-md-7"> <label for="inputTitle">メールアドレス</label> {{ $inputs['email'] }} {{-- index.blade.phpにある'email'を関数化して橋渡ししたもの.また、csrf対策もしている--}} <input name="email" value="{{ $inputs['email'] }}" type="hidden"> </div> </div> <div class="form-group"> <div class="my-3 mx-auto col-md-7"> <label for="inputTitle">件名</label> {{ $inputs['title'] }} {{-- index.blade.phpにある'title'を関数化して橋渡ししたもの.また、csrf対策もしている--}} <input ame="title" value="{{ $inputs['title'] }}" type="hidden"> </div> </div> <div class="form-group"> <div class="my-3 mx-auto col-md-7"> <label for="inputTitle">お問い合わせ内容</label> {!! nl2br(e($inputs['body'])) !!} <input name="body" value="{{ $inputs['body'] }}" type="hidden"> </div> </div> <div class="form-group row mt-5 justify-content-around"> <input type="submit" name="action" class="btn bg-primary text-white btn-lg" value="投稿内容を送信する"> <input type="submit" name="action" class="btn bg-danger text-white btn-lg" value="入力内容を修正する"> </div> </div> </div> </div> </form> @endsection
complete.blade.php @extends('layouts.app') @section('content') <h1>{{ __('送信完了') }}</h1> @endsection

試したこと

エラー文の意味としてはPOSTメソッドで設定すべきなのにGETメソッドに指定しているということなのでweb.phpのgetをpostを変更。また、viewのgetをPOSTに変更しても同じエラーが出ます。

補足情報(FW/ツールのバージョンなど)

laravel 6.20

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sendアクションのバリデーションでエラーが発生しているのではないでしょうか。
その場合、Laravelがリクエスト元のページを表示したURL(/contact/confirm)へリダイレクトしてくれるのですが、リダイレクトはGETメソッドです。
ルーティングでは、/contact/confirmはPOSTメソッドしか受け付けていないため、今回のエラーになっているのだと思います。

sendアクションでバリデーションエラーになってしまうのは、confirm.blade.phpで name が ame になっており、title の値が正しく送信されていないからではないでしょうか。

php

1<input ame="title" value="{{ $inputs['title'] }}" type="hidden">

titleの値が正しく送信されるように修正しましょう。

投稿2021/02/18 15:36

編集2021/02/18 16:22
Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tony-Aaron

2021/02/21 15:30

返信が遅くなり大変申し訳ございません。 `ame="title"`という値が存在していないので`name`に編集したら無事突破できました。 一文字違うだけでエラーが発生する恐ろしさを勉強させていただきました。
Lulucom

2021/02/21 23:49

解決されたようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問