РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
674 of 1392 menu

Исключение 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,
    выбрасывается при отказе в доступе к ресурсу
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить