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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1262閲覧

laravel お問い合わせフォームについて

taizoyama

総合スコア3

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/02/05 16:53

編集2021/02/07 02:35

laravelでお問い合わせフォームを作成しているのですが、
入力内容修正のために戻るボタンと、送信ボタンのどちらともボタンを押すと、

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

のエラーが出てしまいます。

route

1//入力ページ 2Route::get('/contact', 'ContactController@index')->name('contact.index'); 3 4//確認ページ 5Route::post('/contact/confirm', 'ContactController@confirm')->name('contact.confirm'); 6 7//送信完了ページ 8Route::post('/contact/thanks', 'ContactController@send')->name('contact.send'); 9

controller

1class ContactController extends Controller 2{ 3 public function index() 4 { 5 //フォーム入力画ページのviewを表示 6 return view('contact.index'); 7 } 8 9 public function confirm(Request $request) 10 { 11 //バリデーションを実行(結果に問題があれば処理を中断してエラーを返す) 12 $request->validate([ 13 'name' => 'required', 14 'email' => 'required|email', 15 'title' => 'required', 16 'body' => 'required', 17 ]); 18 19 //フォームから受け取ったすべてのinputの値を取得 20 $inputs = $request->all(); 21 22 //入力内容確認ページのviewに変数を渡して表示 23 return view('contact.confirm', [ 24 'inputs' => $inputs, 25 ]); 26 27 28 } 29 30 public function send(Request $request) 31 { 32 //バリデーションを実行(結果に問題があれば処理を中断してエラーを返す) 33 $request->validate([ 34 'name' => 'required', 35 'email' => 'required|email', 36 'title' => 'required', 37 'body' => 'required' 38 ]); 39 40 //フォームから受け取ったactionの値を取得 41 $action = $request->input('action'); 42 43 //フォームから受け取ったactionを除いたinputの値を取得 44 $inputs = $request->except('action'); 45 46 //actionの値で分岐 47 if($action !== 'submit'){ 48 return redirect() 49 ->route('contact.index') 50 ->withInput($inputs); 51 52 } else { 53 //入力されたメールアドレスにメールを送信 54 \Mail::to($inputs['email'])->send(new ContactSendmail($inputs)); 55 56 //再送信を防ぐためにトークンを再発行 57 $request->session()->regenerateToken(); 58 59 //送信完了ページのviewを表示 60 return view('contact.thanks'); 61 62 } 63 } 64} 65

indexview

1 <form method="POST" action="{{ route('contact.confirm') }}"> 2 @csrf 3 4 <label>お名前</label> 5 <input 6 name="name" 7 value="{{ old('name') }}" 8 type="text"> 9 @if ($errors->has('name')) 10 <p class="error-message">{{ $errors->first('name') }}</p> 11 @endif 12 13 <label>メールアドレス</label> 14 <input 15 name="email" 16 value="{{ old('email') }}" 17 type="text"> 18 @if ($errors->has('email')) 19 <p class="error-message">{{ $errors->first('email') }}</p> 20 @endif 21 22 <label>タイトル</label> 23 <input 24 name="title" 25 value="{{ old('title') }}" 26 type="text"> 27 @if ($errors->has('title')) 28 <p class="error-message">{{ $errors->first('title') }}</p> 29 @endif 30 31 32 <label>お問い合わせ内容</label> 33 <textarea name="body">{{ old('body') }}</textarea> 34 @if ($errors->has('body')) 35 <p class="error-message">{{ $errors->first('body') }}</p> 36 @endif 37 38 <button type="submit"> 39 入力内容確認 40 </button> 41 </form>

comfirmview

1<form method="POST" action="{{ route('contact.send') }}"> 2 @csrf 3 4 <label>お名前</label> 5 {{ $inputs['name'] }} 6 <input 7 name="name" 8 value="{{ $inputs['name'] }}" 9 type="hidden"> 10 11 <label>メールアドレス</label> 12 {{ $inputs['email'] }} 13 <input 14 name="email" 15 value="{{ $inputs['email'] }}" 16 type="hidden"> 17 18 <label>タイトル</label> 19 {{ $inputs['title'] }} 20 <input 21 name="title" 22 value="{{ $inputs['title'] }}" 23 type="hidden"> 24 25 26 <label>お問い合わせ内容</label> 27 {!! nl2br(e($inputs['body'])) !!} 28 <input 29 name="body" 30 value="{{ $inputs['body'] }}" 31 type="hidden"> 32 33 <button type="submit" name="action" value="back"> 34 入力内容修正 35 </button> 36 <button type="submit" name="action" value="submit"> 37 送信する 38 </button> 39</form> 40

参考サイト

どなたかご回答いただけないでしょうか。
何卒よろしくお願い致します。

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

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

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

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

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

m.ts10806

2021/02/05 21:50 編集

>戻るボタン、送信ボタン どこでしょうか。提示されたコードにはないようですが。
taizoyama

2021/02/06 01:34

大変申し訳ございません。コードを変更させて頂きました。
退会済みユーザー

退会済みユーザー

2021/02/06 23:06

viewとして示されているコードは、確認用? 入力用?
taizoyama

2021/02/07 02:31

確認用のviewも追加さて頂きました。知識不足ですみません。
guest

回答1

0

ベストアンサー

$request->validate([ 'name' => 'required', 'email' => 'required|email', 'title' => 'required', 'body' => 'required' ]);

nameというのがどこにあるのか謎なのですが、もしかしてこれは不要なのでは?

投稿2021/02/06 14:37

AbeTakashi

総合スコア4853

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

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

taizoyama

2021/02/06 14:58

viewのコードが抜けておりました。申し訳ございません。
AbeTakashi

2021/02/06 15:06

あとはviewですかね おそらくcontact.index のviewを提示してくれているようですが、contact.confirm のview側も出してくれないとたぶん誰も分からないですね。
taizoyama

2021/02/07 02:32

入力用と確認用を追加させて頂きました。申し訳ございません。
AbeTakashi

2021/02/09 14:33

そもそもsendメソッドで return redirect()->route('contact.index')->withInput($inputs); っておかしいですね。 validateして入力画面に戻すならその手前のconfirmメソッドでやるべきで、 return back()->withInput()->withErrors($validator); とやるのが一般的ではないかと。 confirmメソッドでvalidateが通った場合はそれらのデータをSessionなどに保存し、sendメソッドでそのSessionに保存したデータを使えば、sendメソッドではvalidateする必要は基本的には必要ないと思います。 エラーメッセージはSupported methods: POSTとなっているので、Validateで戻されるときに->withInputが付いてるのでPOSTになってそのようなエラーが出ているのかもしれません(この辺はご自身で調べてください)。
Lulucom

2021/02/09 15:12 編集

sendメソッドのバリデーション(←不要かもしれない)でエラーになったので、元のルートcontact.confirmにリダイレクト(GETリクエスト)されようとしたけど、そのルートがPOSTしか受け付けていないので、このエラーになっているのかもしれませんね。
taizoyama

2021/02/09 15:36

sendメソッドのvalidateを消去し、routeにgetを追記してみたら動きました! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問