Событие ExceptionEvent
Событие ExceptionEvent возникает, когда при обработке
HTTP-запроса выбрасывается исключение. Оно позволяет
перехватить ошибку и вернуть собственный ответ вместо
стандартной страницы ошибки. Первым параметром в
конструктор передаётся объект Request, вторым -
объект Throwable с пойманным исключением, третьим -
объект HttpKernelInterface, в котором произошла ошибка.
Событие доступно через метод getThrowable, который
возвращает исключение, и через методы getResponse и
setResponse для работы с ответом. По умолчанию событие
имеет низкий приоритет, поэтому его обработчики вызываются
после основных слушателей ядра.
Синтаксис
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
Методы класса:
$event->getRequest(); // Request
$event->getThrowable(); // Throwable
$event->getResponse(); // ?Response
$event->setResponse($response);
$event->hasResponse(); // bool
$event->isMainRequest(); // bool
Пример
Давайте создадим слушатель, который перехватывает исключение и возвращает собственный ответ:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
class ExceptionListener
{
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
$response = new Response('error: ' . $exception->getMessage());
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
$event->setResponse($response);
}
}
?>
Теперь зарегистрируем слушатель в конфигурации сервисов:
services:
App\EventListener\ExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.exception }
Результат выполнения кода при исключении с текстом 'page not found':
error: page not found
Пример
Давайте проверим, что исключение относится к главному запросу, прежде чем формировать ответ:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
class ExceptionListener
{
public function onKernelException(ExceptionEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
$path = $request->getPathInfo();
$response = new Response('error on ' . $path);
$event->setResponse($response);
}
}
?>
Результат выполнения кода для адреса /user:
error on /user
Смотрите также
-
событие
RequestEvent,
которое возникает при поступлении запроса -
событие
ResponseEvent,
которое возникает при формировании ответа -
метод
getRequest,
который возвращает объект запроса -
метод
setResponse,
который устанавливает ответ для события