Если вы возвращаете только новый ответ от этого обработчика, ничего не происходит. Вы должны заменить ответ, который в данный момент используется, в случае, если:
<?php
class CustomExceptionListener
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
if ($exception instanceof TestException) {
$response = new JsonResponse(['code' => JsonResponse::HTTP_FORBIDDEN, 'status' => "missing api key!"], JsonResponse::HTTP_FORBIDDEN);
$event->setResponse($response);
}
}
}
Возможным источником этого является сама документация Symfony по адресу https://symfony.com/doc/current/event_dispatcher.html. Причина такого поведения заключается в том, что Symfony регистрирует несколько обработчиков для этого события, например, для записи исключений в журнал. Одна из этих частей гарантирует, что ответ сохраняется в событии, а затем в процессе этот ответ извлекается из события, которое должно быть отправлено клиенту (в основном, \Symfony\Component\HttpKernel\HttpKernel::handleException
).
Событие передается от слушателя к слушателю для отслеживания нескольких модификаций, поскольку само событие содержит больше метаданных, чем только ответ.