Symfony 5 пользовательских страниц 404 - PullRequest
0 голосов
/ 13 февраля 2020

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

  1. Вывести простую строку с кодировкой JSON, например "Не найдено".
    • Указанная строка должна быть прочитана из ресурса перевода.
  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 ошибки и оставить все остальное, как прежде, самой платформой?

1 Ответ

0 голосов
/ 13 февраля 2020

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

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

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

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

# 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')));
    }
}
...