Symfony Throw настраиваемая страница 404 внутри сервиса - PullRequest
0 голосов
/ 31 августа 2018

Мне нужно создать исключение внутри службы

        $isLangExist = $this->em->getRepository('TranslationBundle:Language')->findOneBy(array(
        'locale' => $this->request->getMasterRequest()->getLocale()
    ));
    if (!$isLangExist) {
        throw new createNotFoundException('you are using unavailable langage');
    }

но я получил эту страницу не работает в prod env

как я могу показать страницу 404 с исключением createNotFoundException или любым другим типом исключения

спасибо

1 Ответ

0 голосов
/ 31 августа 2018

Похоже, ваш код неверен. Я ожидаю, что это будет выглядеть так:

if (!$isLangExist) {
    throw $this->createNotFoundException('you are using unavailable langage');
}

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

if (!$isLangExist) {
    throw new NotFoundHttpException('you are using unavailable langage');
}

Ваша проблема выходит за рамки приведенного выше кода, потому что вы не генерируете исключение внутри контроллера, как я ожидал. Вы бросаете это в расширение Twig. Это исключение прервет рендеринг, поэтому ошибка не преобразуется в исключение 404, а вместо этого обрабатывается как ошибка 500. Потенциально вы будете видеть другие 500 ошибок с вашим расширением всякий раз, когда один из запросов завершится неудачно, что, вероятно, не то, что вы хотите. Решение этой проблемы, вероятно, требует переосмысления того, как вы используете эти глобальные переменные ветки.

Вы можете попробовать переместить шаблоны, использующие эти переменные, в отдельные шаблоны, отображаемые выделенным контроллером, используя подзапросы или ESI:

{{
    render(controller(
        'AppBundle:Global:_listCategories',
        {
            'locale': app.request.attributes.get('_locale')
        }
    ))
}}

Другое решение может заключаться в том, чтобы установить их с помощью null или объекта ошибки каждый раз, когда что-то не получается, и затем реагировать на эти «альтернативные» результаты в вашем шаблоне, что я бы не предпочел.

Возможно, есть много других способов решения этой проблемы. Суть в том, что ошибки рендеринга отличаются от http-исключений, генерируемых службами контроллеров. Вы должны убедиться, что ваши шаблоны могут быть отображены, несмотря на эти отсутствующие / неисправные переменные, или иметь дело с этими отсутствующими параметрами, прежде чем отображать шаблоны, например, в слушателе событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...