Возникла задача — заменить стандартное сообщение об ошибке на что-то более дружелюбное и понятное для пользователя. Например, если для текущего URI не определён роутинг — то выводить json:
{"status":"error","message":"Unknown endpoint."}
Вместо этого кирпичного безумия:
Решить эту задачу можно с помощью определения собственного обработчика событий.
Решается это достаточно просто. Для начала нужно создать файл, например ExceptionListener.php с таким содержимым:
<?php namespace MyBundle; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; class ExceptionListener { public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); if($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) { $response = json_encode(['status' => 'error', 'message' => 'Unknown endpoint.']); $event->setResponse(Response::create($response)); } } }
Собственно в строке $exception = $event->getException(); извлекается объект-исключения из объекта-события. Далее происходит проверка, если это NotFoundHttpException исключение, тогда генерим для него юзер-френдли ответ.
Теперь в файл config.php нужно добавить:
$container ->autowire(\MyBundle\ExceptionListener::class) ->addTag('kernel.event_listener', ['event' => 'kernel.exception']) ;
На этом всё, можно деплоить и наслаждаться кошерным json-ответом!
Официальная документация Симфони не всегда даёт рабочие советы. Например, там имеется страница с заголовком How to Customize Error Pages и пунктами: Overriding the Default Error Templates, Overriding the Default ExceptionController и Working with the kernel.exception Event. Однако, первые 2 варианта не сработали, а третий вариант ссылается на страницу Events and Event Listeners где уже в пункте Creating an Event Listener рассказывается то, что я вкратце привёл в данной заметке.