Исключение MethodNotAllowedHttpException
Исключение MethodNotAllowedHttpException наследуется от
HttpException и соответствует HTTP-статусу 405.
Оно выбрасывается компонентом Routing, когда для запрошенного
URL найден маршрут, но ни один из методов контроллера не
подходит под HTTP-метод входящего запроса. Первым параметром
конструктор принимает массив разрешённых методов, вторым -
сообщение, третьим - предыдущее исключение.
Синтаксис
new MethodNotAllowedHttpException(
array $allowed,
string $message = '',
?Throwable $previous = null,
int $code = 0
)
Пример
Давайте выбросим исключение вручную, указав,
что для адреса '/article' разрешены только
методы 'GET' и 'POST':
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionMethodNotAllowedHttpException;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$allowed = ['GET', 'POST'];
throw new MethodNotAllowedHttpException($allowed);
}
}
?>
При обращении к адресу '/article' методом 'PUT'
браузер получит ответ со статусом 405.
Пример
Давайте перехватим исключение и вернём статус и разрешённые методы:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionMethodNotAllowedHttpException;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
try {
$allowed = ['GET', 'POST'];
throw new MethodNotAllowedHttpException($allowed);
} catch (MethodNotAllowedHttpException $e) {
$status = $e->getStatusCode();
$headers = $e->getHeaders();
return new Response(
'Status: ' . $status . ', Allowed: ' . $headers['Allow']
);
}
}
}
?>
Результат выполнения кода:
"Status: 405, Allowed: GET, POST"
Пример
Давайте выбросим исключение с собственным сообщением и предыдущим исключением:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionMethodNotAllowedHttpException;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$allowed = ['GET'];
$previous = new Exception('previous error');
throw new MethodNotAllowedHttpException(
$allowed,
'Method is not allowed for this route',
$previous
);
}
}
?>
При перехвате такого исключения метод getMessage
вернёт строку "Method is not allowed for this route",
а getPrevious - исходное исключение.
Смотрите также
-
класс
HttpException,
базовый класс для HTTP-исключений -
исключение
NotFoundHttpException,
которое соответствует ошибке 404 -
метод
getStatusCode,
который возвращает HTTP-код исключения -
метод
getMessage,
который возвращает сообщение исключения