#何が起きた?
Laravel8にて、アップロード画面のルート設定で以下の記述を書いたところ、タイトルのように「The GET method is not supported for this route. Supported methods: POST.」のエラーが。。。
Route::post('ctrl.upload', [CtrlController::class, 'uploaded']);
原因を探るが、どれを試してみても効果なし。
しかもLaravelのエラー画面が教えてくれる場所は「vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php:117」で、そこちゃうねん(多分)。
頭をひねること数時間、最後は
「うわ、こんなしょうもないことで。。。」
と原因に気づきました。
そうは思ってもプログラム書いてるとこんなこと日常茶飯事。
そんなわけで、備忘録も兼ねて同じトラップ(?)にハマった人のために残しておきます。
#解決策はこれ!
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さんからご指摘があったので修正しました。
(文章苦手なんで誰か校正入れて〜)
上記の違いを流れに沿って説明すると、
- 最初はアップロードするデータを何も選択(または入力)していないので、受け取るデータがないためRoute::getを使用。
- アップロードするデータを選択(または入力)し、アップロードをクリック。
- アップロードされたデータの名前(ファイル名や入力値)を表示したいので、前のページからデータを受け取るためにRoute::postを使用。
という流れになります。
ちなみに、もともとは「upload()」という関数をコントローラーに作っていたのですが、中身はデータを受け取った後の処理だけが書かれていたので、これを「uploaded()」に変更し、データを何も選択していない状態の初期画面用に新たに「upload()」を用意しました。
新しい「upload()」にはデータの名前を表示するための$resultに対して、
public function upload()
{
return view('/ctrl/upload', ['result' => '']);
}
とだけ記述してあります。
最後のが役立つかは謎ですが、とりあえず解決した人がいれば嬉しいです。
じゃーねー(^o^)ノシ