Исключение MethodNotAllowedHttpException
Исключение MethodNotAllowedHttpException выбрасывается в Laravel, когда клиент отправляет запрос с методом (GET, POST, PUT, DELETE и т.д.), который не поддерживается указанным маршрутом. Например, если маршрут определён только для POST, а клиент пытается обратиться к нему через GET. Это исключение входит в группу HTTP-исключений и наследуется от HttpException, что позволяет гибко обрабатывать его в вашем приложении.
Исключение не требует прямого вызова в коде, так как Laravel автоматически генерирует его при несоответствии методов. Однако вы можете вручную создать экземпляр этого исключения для тестирования или логирования. При возникновении ошибки фреймворк возвращает HTTP-ответ со статусом 405, а также информативное сообщение о том, какие методы разрешены для данного маршрута.
Синтаксис
<?php
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
// Создание исключения с сообщением и списком разрешённых методов
throw new MethodNotAllowedHttpException(['GET', 'POST'], 'Custom message');
?>
Пример
Рассмотрим типичную ситуацию возникновения исключения. Определим маршрут только для POST-запросов:
<?php
use Illuminate\Support\Facades\Route;
Route::post('/submit', function () {
return "Form submitted successfully!";
});
?>
Если клиент отправит GET-запрос на этот маршрут, Laravel выбросит исключение:
// Ошибка: MethodNotAllowedHttpException
// Сообщение: "The GET method is not supported for this route. Supported methods: POST."
Пример
Более сложный случай, когда маршрут поддерживает несколько методов, но клиент использует недопустимый:
<?php
use Illuminate\Support\Facades\Route;
Route::match(['GET', 'POST'], '/user/profile', function () {
return view('user.profile');
});
?>
При попытке отправки PUT-запроса будет выброшено исключение с указанием разрешённых методов:
"MethodNotAllowedHttpException: The PUT method is not supported for this route. Supported methods: GET, POST."
Пример
Рассмотрим пример обработки исключения с помощью глобального обработчика ошибок Laravel. В файле Handler можно переопределить метод render для кастомизации ответа:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof MethodNotAllowedHttpException) {
return response()->json([
'error' => 'Method not allowed',
'message' => $exception->getMessage(),
'supported_methods' => $exception->getHeaders()['Allow'] ?? []
], 405);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при возникновении исключения:
{"error":"Method not allowed","message":"The GET method is not supported for this route. Supported methods: POST.","supported_methods":["POST"]}
Пример
Иногда требуется программно проверить, поддерживает ли маршрут определённый метод, чтобы избежать исключения. Это можно сделать с помощью фасада Route:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
public function checkMethod(Request $request)
{
$route = Route::getCurrentRoute();
$allowedMethods = $route->methods();
if (!in_array($request->method(), $allowedMethods)) {
return response()->json([
'error' => 'Method not allowed',
'allowed' => $allowedMethods
], 405);
}
return "Method is allowed!";
}
}
?>
Результат выполнения кода при проверке недопустимого метода:
{"error":"Method not allowed","allowed":["GET","POST"]}
Смотрите также
-
класс
HttpException,
базовый класс для всех HTTP-исключений в Laravel -
исключение
NotFoundHttpException,
возникает при обращении к несуществующему маршруту -
исключение
TooManyRequestsHttpException,
возникает при превышении лимита запросов -
исключение
AccessDeniedHttpException,
выбрасывается при отказе в доступе к ресурсу