Похоже, ваш код неверен. Я ожидаю, что это будет выглядеть так:
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-исключений, генерируемых службами контроллеров. Вы должны убедиться, что ваши шаблоны могут быть отображены, несмотря на эти отсутствующие / неисправные переменные, или иметь дело с этими отсутствующими параметрами, прежде чем отображать шаблоны, например, в слушателе событий.