Как в Symfony 3.4 заменить стандартное сообщение об ошибке

Возникла задача — заменить стандартное сообщение об ошибке на что-то более дружелюбное и понятное для пользователя. Например, если для текущего 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 рассказывается то, что я вкратце привёл в данной заметке.