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

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