Пользовательская страница 404 Symfony 5

Я пытаюсь создать пользовательскую страницу 404 для проекта Symfony 5, которая должна:

  1. Output a simple JSON-encoded string, like "Not found".
    • Said string must be read from a translation resource.
  2. Добавьте дополнительный заголовок Content-Type: application/json.

В документации Symfony есть раздел, , который пытается объясните, как этого можно добиться, но информация кажется неполной/неверной, по-видимому, написанной для версии 4.X, даже указывая на несуществующие исходные файлы на GitHub.

Мне удалось создать контроллер ошибок, но он проглатывает все ошибки:

# config/packages/framework.yaml
framework:
    error_controller: App\Controller\ErrorController::errorHandler
// src/Controller/ErrorController.php
class ErrorController extends AbstractController
{
    public function errorHandler(TranslatorInterface $translator) : JsonResponse
    {
        return new JsonResponse($translator->trans('not_found'));
    }
}

Проблема в том, что это приводит к тому, что любая ошибка (в том числе внутренняя) возвращает страницу 404.

Как я могу заставить этот контроллер/метод обрабатывать только ошибки 404 и оставить все остальное для обработки, как и прежде, самой структурой?


person Silviu G    schedule 13.02.2020    source источник
comment
Вы правы насчет того, что документы устарели. Однако это единственное, что вы пробовали? Он буквально говорит: чтобы переопределить вывод ошибок, отличных от HTML, необходимо установить компонент Serializer. (Вы сделали это?). если ваша страница уже использует _format json по умолчанию (это означает, что все это json api), это может уже выполнять большую часть вашей работы. Поэтому прочитайте раздел Переопределение вывода ошибок для форматов, отличных от HTML: symfony.com/doc/current/controller/ вернуться, если проблемы не исчезнут....   -  person Jakumi    schedule 13.02.2020
comment
также в качестве возможной альтернативы вы также можете реализовать EventListener, который прослушивает событие kernel.exception, чтобы быть конкретным для исключения notfound (не знаю точного имени, я думаю, что это HttpNotFoundException) и сгенерировать Response и установить его на событие, которое должно немедленно остановить распространение этого события и вернуть любой ответ, который у вас есть. EventListeners также могут быть введены с помощью TranslatorInterface, так что это почти не имеет значения для вашего контроллера, но более специфично для 404.   -  person Jakumi    schedule 13.02.2020


Ответы (1)


Для всех, кто ищет решение для страницы JSON 404 для приложения Symfony:

Я искал способ использовать контроллер для обработки определенных случаев ошибок, поскольку на первый взгляд это казалось самым простым вариантом, но это не представляется возможным, или, по крайней мере, я не понял, как это сделать.

В конце концов я нашел решение, используя события и прослушиватели событий:

Конфигурация:

# config/services.yaml

services:

    ...

    # This listener handles only 404 errors in PROD mode
    App\EventListener\ExceptionListener:
        tags:
            - { name: kernel.event_listener, event: kernel.exception }

Прослушиватель событий:

// src/EventListener/ExceptionListener.php
class ExceptionListener {
    public function onKernelException(ExceptionEvent $event) : void
    {
        if (
            $_ENV['APP_ENV'] != 'prod'
            || !$event->isMasterRequest()
            || !$event->getThrowable() instanceof NotFoundHttpException
        ) {
            return;
        }

        // Send a not found in JSON format
        $event->setResponse(new JsonResponse($this->translator->trans('not_found')));
    }
}
person Silviu G    schedule 13.02.2020
comment
Вы можете опубликовать лучшее решение вместо того, чтобы просто проголосовать за него. - person Silviu G; 21.07.2020