LoginSignup
34
20

More than 1 year has passed since last update.

Route::postにするとなぜか「The GET method is not supported for this route. Supported methods: POST.」が出る。

Last updated at Posted at 2021-03-23

目次

1.何が起きた?
2.解決策はこれ!

何が起きた?

Laravel8にて、アップロード画面のルート設定で以下の記述を書いたところ、タイトルのように「The GET method is not supported for this route. Supported methods: POST.」のエラーが。。。

web.php
Route::post('ctrl.upload', [CtrlController::class, 'uploaded']);

原因を探るが、どれを試してみても効果なし。

しかもLaravelのエラー画面が教えてくれる場所は「vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php:117」で、そこちゃうねん(多分)。

頭をひねること数時間、最後は
「うわ、こんなしょうもないことで。。。」
と原因に気づきました。

そうは思ってもプログラム書いてるとこんなこと日常茶飯事。
そんなわけで、備忘録も兼ねて同じトラップ(?)にハマった人のために残しておきます。

解決策はこれ!

web.php
Route::get('ctrl.upload', [CtrlController::class, 'upload']);
Route::post('ctrl.upload', [CtrlController::class, 'uploaded']);

分かりますよね?

そうです、Route::getをpostの前に追加しただけです。

ちなみに自分の場合は、getはすでに書いてるもんなーという確認(記憶)ミスでした。

ひとりプログラマだから誰も教えてくれない環境つらたん。

Route::getとRoute::postの違い

これ、初心者だとよくある勘違いなのですが、今回のアップロード画面でのget/postを分かりやすく言えば、
getはすでに存在するデータを取得するために使い、
postは前のページからデータを受け取るために使います。

getはアップロード画面を取得(upload)するために使い、postはアップロード画面で「アップロードする」を押すことで指定の送信先ルート(uploaded)へアップするデータを送信するために使います。
2021.06.25に@Grandpaさんからご指摘があったので修正しました。
(文章苦手なんで誰か校正入れて〜)

上記の違いを流れに沿って説明すると、
1. 最初はアップロードするデータを何も選択(または入力)していないので、受け取るデータがないためRoute::getを使用。
2. アップロードするデータを選択(または入力)し、アップロードをクリック。
3. アップロードされたデータの名前(ファイル名や入力値)を表示したいので、前のページからデータを受け取るためにRoute::postを使用。

という流れになります。


ちなみに、もともとは「upload()」という関数をコントローラーに作っていたのですが、中身はデータを受け取った後の処理だけが書かれていたので、これを「uploaded()」に変更し、データを何も選択していない状態の初期画面用に新たに「upload()」を用意しました。
新しい「upload()」にはデータの名前を表示するための$resultに対して、

CtrlController.php
public function upload()
{
  return view('/ctrl/upload', ['result' => '']);
}

とだけ記述してあります。

最後のが役立つかは謎ですが、とりあえず解決した人がいれば嬉しいです。

じゃーねー(^o^)ノシ

34
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
20