質問するログイン新規登録
Laravel

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

PHP

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

Q&A

1回答

387閲覧

laravel:問い合わせフォーム実装でのエラー

MKYS

総合スコア0

Laravel

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

PHP

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

0グッド

0クリップ

投稿2024/06/20 23:09

0

0

実現したいこと

HTTPメソッド | ルートパス | コントローラ    | アクション | 説明
get       | /      | ContactController | index    | 入力フォームの表示
post      | /confirm  | ContactController | confirm   | 入力内容確認画面の表示
post      | /thanks  | ContactController | store    | データ保存完了ページ表示

上記におけるデータ保存・完了ページ表示を実現したいです。

発生している問題・分からないこと

入力内容確認画面からpostメソッドでデータ保存完了ページにアクセスを試みると、以下のエラーメッセージが表示されました。

エラーメッセージ

error

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

該当のソースコード

web.php

1<?php 2 3use Illuminate\Support\Facades\Route; 4use App\Http\Controllers\ContactController; 5 6Route::get('/',[ContactController::class, 'index']); 7Route::post('/confirm',[ContactController::class, 'confirm']); 8Route::post('/thanks',[ContactController::class, 'store']);

ContactController

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Http\Requests\ContactRequest; 6use App\Models\Contact; 7use App\Models\Category; 8 9class ContactController extends Controller 10{ 11 public function index() 12 { 13 $categories = Category::all(); 14 return view('index',compact('categories')); 15 } 16 17 public function confirm(ContactRequest $request) 18 { 19 $contact = $request->only(['first_name', 'last_name','gender','email', 'tell1','tell2','tell3', 'address','building','category_id','detail']); 20 $category = Category::find($contact['category_id']); 21 return view('confirm', compact('contact','category')); 22 } 23 24 public function store(ContactRequest $request) 25 { 26 $contact = $request->only(['first_name', 'last_name','gender','email', 'tell1','tell2','tell3', 'address','building','category_id','detail']); 27 Contact::create($contact); 28 return redirect('thanks'); 29 } 30} 31

confirm.blade.php(入力内容確認画面用viewファイル)

1// 中略 2 3@section('content') 4 <div class="confirm__content"> 5 <div class="confirm__heading"> 6 <h2>Confirm</h2> 7 </div> 8 <form class="form" action="/thanks" method="post"> 9 @csrf 10 <div class="confirm-table"> 11 <table class="confirm-table__inner"> 12 <tr class="confirm-table__row"> 13 <th class="confirm-table__header">お名前</th> 14 <td class="confirm-table__text"> 15 <p>{{ $contact['first_name'] }}</p> 16 <input type="hidden" name="first_name" value="{{ $contact['first_name'] }}"/> 17 <p>{{ $contact['last_name'] }}</p> 18 <input type="hidden" name="last_name" value="{{ $contact['last_name'] }}"/> 19 </td> 20 </tr> 21 <tr class="confirm-table__row"> 22 <th class="confirm-table__header">性別</th> 23 <td class="confirm-table__text"> 24 <p> 25 @php 26 switch($contact['gender']){ 27 case "1": 28 echo "男性"; 29 break; 30 case "2": 31 echo "女性"; 32 break; 33 case "3": 34 echo "その他"; 35 break; 36 } 37 @endphp 38 </p> 39 <input type="hidden" name="gender" value="{{ $contact['gender'] }}"/> 40 </td> 41 </tr> 42 <tr class="confirm-table__row"> 43 <th class="confirm-table__header">メールアドレス</th> 44 <td class="confirm-table__text"> 45 <p>{{ $contact['email'] }}</p> 46 <input type="hidden" name="email" value="{{ $contact['email'] }}"/> 47 </td> 48 </tr> 49 <tr class="confirm-table__row"> 50 <th class="confirm-table__header">電話番号</th> 51 <td class="confirm-table__text"> 52 <p>{{ $contact['tell1'] }}{{ $contact['tell2'] }}{{ $contact['tell3'] }}</p> 53 <input type="hidden" name="tell" value="{{ $contact['tell1'] }}{{ $contact['tell2'] }}{{ $contact['tell3'] }}"/> 54 </td> 55 </tr> 56 <tr class="confirm-table__row"> 57 <th class="confirm-table__header">住所</th> 58 <td class="confirm-table__text"> 59 <p>{{ $contact['address'] }}</p> 60 <input type="hidden" name="address" value="{{ $contact['address'] }}"/> 61 </td> 62 </tr> 63 <tr class="confirm-table__row"> 64 <th class="confirm-table__header">建物名</th> 65 <td class="confirm-table__text"> 66 <p>{{ $contact['building'] }}</p> 67 <input type="hidden" name="building" value="{{ $contact['building'] }}"/> 68 </td> 69 </tr> 70 <tr class="confirm-table__row"> 71 <th class="confirm-table__header">お問い合わせの種類</th> 72 <td class="confirm-table__text"> 73 <p>{{ $category['content'] }}</p> 74 <input type="hidden" name="category_id" value="{{ $contact['category_id'] }}"> 75 </td> 76 </tr> 77 <tr class="confirm-table__row"> 78 <th class="confirm-table__header">お問い合わせ内容</th> 79 <td class="confirm-table__text"> 80 <p>{!! nl2br(e($contact['detail'])) !!}</p> 81 <input type="hidden" name="detail" value="{{ $contact['detail'] }}"/> 82 </td> 83 </tr> 84 </table> 85 </div> 86 <div class="form__button"> 87 <button class="form__button-submit" type="submit">送信</button> 88 <a class="form__button-correction" href="#" onclick="event.preventDefault(); history.back();">修正</a> 89 </div> 90 </form> 91 </div> 92@endsection

ContactRequest(リクエストフォーム)

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class ContactRequest extends FormRequest 8{ 9 public function authorize() 10 { 11 return true; 12 } 13 14 public function rules() 15 { 16 return [ 17 'first_name' => ['required'], 18 'last_name' => ['required'], 19 'gender'=>['required','in:1,2,3'], 20 'email' => ['required', 'email',], 21 'tell1' => ['required','digits_between:1,5'], 22 'tell2' => ['required','digits_between:1,5'], 23 'tell3' => ['required','digits_between:1,5'], 24 'address'=>['required'], 25 'category_id'=>['required','exists:categories,id'], 26 'detail'=>['required','max:120'], 27 ]; 28 } 29 30 public function messages() 31 { 32 return [ 33 'first_name.required' => '姓を入力してください', 34 'last_name.required' => '名を入力してください', 35 'gender.required' => '性別を選択してください', 36 'email.required' => 'メールアドレスを入力してください', 37 'email.email' => 'メールアドレスはメール形式で入力してください', 38 'tell1.required' => '電話番号を入力してください', 39 'tell1.digits_between'=>'電話番号は5桁までの数字で入力してください', 40 'tell2.required' => '電話番号を入力してください', 41 'tell2.digits_between'=>'電話番号は5桁までの数字で入力してください', 42 'tell3.required' => '電話番号を入力してください', 43 'tell3.digits_between'=>'電話番号は5桁までの数字で入力してください', 44 'address.required'=>'住所を入力してください', 45 'category_id.exists'=>'お問い合わせの種類を選択してください', 46 'detail.required'=>'お問い合わせ内容を入力してください', 47 'detail.max'=>'お問い合わせ内容は120文字以内で入力してください', 48 ]; 49 } 50}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

○Route::get('/confirm',[ContactController::class, 'confirm']); を追記
→リダイレクトが繰り返し行われ、エラー

○バリデーションの確認
→バリデーションに失敗し、前の画面へリダイレクト(get)していた為ルーティングが見つからずエラーした可能性を考え、viewファイルにおけるバリデーション記述箇所をコメントアウトするも同エラー
(文字数の兼ね合いで投稿内容上に記載できていませんが、入力フォーム用のviewファイルにバリデーションを記述しています)

○デベロッパーツールで動作確認
→リクエストURL:http://localhost/confirm
リクエストメソッド:GET
ステータスコード:405 Method Not Allowed

補足

特になし

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

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

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

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

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

sk_

2024/06/21 18:23

storeメソッドの最後、リダイレクト処理がGETなので 他の回答の通りreturn view('thanks')とした上で、 その直前にdd('test')として、どうなるか確認してください。 同エラーとなる場合、実際に生成されたHTMLのformタグmethod属性がどう出力するか確認し、 bladeと異なる場合はViewのキャッシュをクリアしてください。 また、URLのベタ打ちは勘違いの元になるため、 routeで各ルーティングに->name('index'), ->name('thanks')等として、 Viewでは /thanks の代わりに {{route('thanks')}}として動的にURLを生成してください。 あと、これはあまり関係ないと思いますが、Viewにバリデーションの記述?をされてるという点が違和感です。 @errorの表示のことでしょうか?
sk_

2024/06/21 18:32

もう一点。 > 入力内容確認画面からpostメソッドでデータ保存完了ページにアクセスを試みると、以下のエラーメッセージが表示されました。 > ○デベロッパーツールで動作確認 > →リクエストURL:http://localhost/confirm > リクエストメソッド:GET > ステータスコード:405 Method Not Allowed confirmからstore(/thanks)への送信をしたいタイミングで、リクエスト先がconfirmとなっているんでしょうか? リクエスト先は/thanksではありませんか? こちらも先述のViewのキャッシュ等の影響かもしれませんが、違和感のある内容なので再度確認されるのが良いでしょう。
guest

回答1

0

return redirect('thanks');はGETで/thanksを表示しようとする。そんなルートはないのでエラー。

thanks用のbladeを用意してredirectではなくviewを表示すればいい。

php

1return view('thanks');

投稿2024/06/20 23:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MKYS

2024/06/20 23:36

早速回答ありがとうございます。 試してみましたが解決できませんでした。 public function store(ContactRequest $request) { $contact = $request->only(['first_name', 'last_name','gender','email', 'tell1','tell2','tell3', 'address','building','category_id','detail']); Contact::create($contact); return view('thanks'); } 上記のようにコードを修正しましたが、同エラーメッセージが表示されてしまいました。 この場合どの辺りに原因がありそうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問