LaravelのMethodNotAllowedHttpException:原因と解決策

はるか
はるか
MethodNotAllowedHttpException。めんどくさ。

ふゅか
ふゅか
ルートの設定ミスだね~。

1. MethodNotAllowedHttpExceptionの概要

Laravelで開発を進める中で、MethodNotAllowedHttpExceptionという例外処理に遭遇することがあります。この例外処理は、HTTPリクエストのメソッドがルートで指定されたものと一致しない場合に発生します。例えば、ルートがGETメソッドを受け付けるように定義されているのに、POSTメソッドでリクエストを送信した場合にこの例外処理が発生します。

2. 例外処理の原因

MethodNotAllowedHttpExceptionは、指定されたHTTPメソッドがルートの宣言と一致しないときに発生します。これは、以下のような状況でよく見られます。

  1. ルート宣言がGETメソッドのみを受け付けるように設定されているが、POSTリクエストが送信された。
  2. 逆に、POSTメソッドのみを受け付けるように設定されているが、GETリクエストが送信された。

このようなミスマッチが原因で、Laravelは適切なコントローラーのメソッドを見つけることができず、この例外をスローします。

ふゅか
ふゅか
うっかり間違えちゃうこと、あるあるだよね♪

はるか
はるか
気を付ければ防げる。簡単なチェックだけ。

3. 解決策

このエラーを解決するには、リクエストのHTTPメソッドとルートの宣言が一致していることを確認する必要があります。具体的には、以下の手順を踏んで解決します。

3.1. web.phpを確認する

まず、ルートファイル(routes/web.phproutes/api.php)で宣言されているルートと、リクエストのHTTPメソッドが正しく一致しているかを確認します。

use App\Http\Controllers\SampleController;

Route::get('/sample-route', [SampleController::class, 'sampleMethod']);
ふゅか
ふゅか
ルート設定を見直すのが第一歩だね!

4. エラーの検証と修正

次に、エラーを検証し、修正していきます。まず、エラーを検証するために次の画像のような “The GET method is not supported for route sample. Supported methods: POST.” という例外処理を発生させることを目的とします。

ふゅか
ふゅか
意味が分からないとこんなエラーが出るとびっくりしちゃうね!

はるか
はるか
落ち着いて。原因を見つけよう。

4.1. 検証環境

今回の検証環境は次のようになります。

  • PHP 8.1.25
  • Laravel 10.48.12
  • Windows 11

4.2. コントローラーの作成

ルートで指定されたコントローラーが存在し、正しくメソッドが定義されているかを確認します。以下のようにSampleControllerを作成します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
    public function sampleMethod(Request $request)
    {
        return response()->json(['message' => 'Sample method executed successfully']);
    }
}

4.3. ルーティング

web.phpで POST メソッドの場合は次のように宣言します。

Route::post('/sample', [SampleController::class, 'sampleMethod']);

4.4. エラーの発生と検証

まず、ターミナルで php artisan serve コマンドを実行します。次に、 http://127.0.0.1:8000/sample にアクセスします。
“The GET method is not supported for route sample. Supported methods: POST.” というエラーが発生しました。

ふゅか
ふゅか
あ、エラーが出た!

はるか
はるか
GETメソッドをPOSTに変更するだけ。簡単な修正。

このエラーは、GETメソッドがルート “sample” でサポートされていないことを示しています。最初に設定したルートのPOSTメソッドをGETメソッドに修正する必要があります。このエラーを解消するために、以下のように修正します。

Route::get('/sample', [SampleController::class, 'sampleMethod']);

この修正により、次のようにJSONレスポンスが返されることでエラーが解消されました。

はるか
はるか
修正完了。

ふゅか
ふゅか
やったね!これでちゃんと動くようになった!

PR