Интерфейс HttpExceptionInterface
Интерфейс HttpExceptionInterface реализуется классами исключений,
которые должны вернуть клиенту определённый HTTP-статус.
Он объявляет два метода: getStatusCode возвращает код ответа
(например, 404 или 403), а getHeaders - массив заголовков,
которые нужно добавить к ответу. Благодаря этому интерфейсу
Symfony понимает, каким HTTP-кодом завершить запрос,
если исключение не было перехвачено вручную.
Любой собственный класс исключения может реализовать этот интерфейс и тем самым превратиться в полноценное HTTP-исключение, которое ядро Symfony корректно преобразует в ответ с нужным статусом.
Синтаксис
<?php
interface HttpExceptionInterface extends Throwable
{
public function getStatusCode(): int;
public function getHeaders(): array;
}
?>
Пример
Давайте создадим собственное исключение, которое реализует
интерфейс HttpExceptionInterface и возвращает статус 404:
<?php
namespace AppException;
use SymfonyComponentHttpKernelExceptionHttpExceptionInterface;
class ArticleNotFoundException extends \RuntimeException implements HttpExceptionInterface
{
public function getStatusCode(): int
{
return 404;
}
public function getHeaders(): array
{
return ['X-Error' => 'article-not-found'];
}
}
?>
Теперь выбросим это исключение из метода контроллера:
<?php
namespace AppController;
use AppExceptionArticleNotFoundException;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(int $id): Response
{
if ($id > 100) {
throw new ArticleNotFoundException('Article not found');
}
return new Response('article');
}
}
?>
Результат выполнения кода для адреса /article/200 - ответ со статусом 404
и заголовком X-Error:
HTTP/1.1 404 Not Found
X-Error: article-not-found
Пример
Давайте перехватим исключение и прочитаем статус и заголовки через методы интерфейса:
<?php
namespace AppController;
use AppExceptionArticleNotFoundException;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionHttpExceptionInterface;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/check/{id}', name: 'article_check')]
public function check(int $id): Response
{
try {
if ($id > 100) {
throw new ArticleNotFoundException('Article not found');
}
return new Response('article');
} catch (HttpExceptionInterface $e) {
$status = $e->getStatusCode();
$headers = $e->getHeaders();
return new Response(
'status: ' . $status . ', header: ' . $headers['X-Error'],
$status,
$headers
);
}
}
}
?>
Результат выполнения кода для адреса /article/check/200:
"status: 404, header: article-not-found"
Смотрите также
-
метод
getStatusCode,
который возвращает HTTP-код исключения -
метод
getHeaders,
который возвращает заголовки ответа -
класс
HttpException,
который реализует этот интерфейс -
класс
NotFoundHttpException,
который возвращает статус 404