LaravelのMethodNotAllowedHttpException:原因と解決策



1. MethodNotAllowedHttpExceptionの概要
Laravelで開発を進める中で、MethodNotAllowedHttpException
という例外処理に遭遇することがあります。この例外処理は、HTTPリクエストのメソッドがルートで指定されたものと一致しない場合に発生します。例えば、ルートがGET
メソッドを受け付けるように定義されているのに、POST
メソッドでリクエストを送信した場合にこの例外処理が発生します。
2. 例外処理の原因
MethodNotAllowedHttpException
は、指定されたHTTPメソッドがルートの宣言と一致しないときに発生します。これは、以下のような状況でよく見られます。
- ルート宣言が
GET
メソッドのみを受け付けるように設定されているが、POST
リクエストが送信された。 - 逆に、
POST
メソッドのみを受け付けるように設定されているが、GET
リクエストが送信された。
このようなミスマッチが原因で、Laravelは適切なコントローラーのメソッドを見つけることができず、この例外をスローします。


3. 解決策
このエラーを解決するには、リクエストのHTTPメソッドとルートの宣言が一致していることを確認する必要があります。具体的には、以下の手順を踏んで解決します。
3.1. web.phpを確認する
まず、ルートファイル(routes/web.php
やroutes/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メソッドがルート “sample” でサポートされていないことを示しています。最初に設定したルートのPOSTメソッドをGETメソッドに修正する必要があります。このエラーを解消するために、以下のように修正します。
Route::get('/sample', [SampleController::class, 'sampleMethod']);
この修正により、次のようにJSONレスポンスが返されることでエラーが解消されました。

