我需要在服务内部抛出异常
$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中不起作用
如何显示带有createNotFoundException或其他任何异常类型的404页面
谢谢
答案 0 :(得分:5)
您的代码似乎不正确。我希望它看起来像这样:
if (!$isLangExist) {
throw $this->createNotFoundException('you are using unavailable langage');
}
该方法是您可以使用的抽象基本控制器的一部分,但这不是强制性的。在不扩展此控制器的情况下应该起作用的是:
if (!$isLangExist) {
throw new NotFoundHttpException('you are using unavailable langage');
}
您的问题超出了上面的代码,因为您没有像我期望的那样在控制器内引发异常。您将其扔到Twig扩展中。此异常将中断渲染,因此,该错误不会转换为404异常,而是被视为500错误。每当其中一个查询失败时,您的扩展名可能还会看到其他500错误,这可能不是您想要的。解决此问题可能需要重新考虑如何使用这些全局树枝变量。
您可以尝试将使用这些变量的模板移到由专用控制器使用sub requests或ESI呈现的单独模板中:
{{
render(controller(
'AppBundle:Global:_listCategories',
{
'locale': app.request.attributes.get('_locale')
}
))
}}
另一种解决方案可能是在发生任何故障时使用null
或错误对象进行设置,然后对模板中的这些“替代”结果做出反应,这不是我所希望的。
可能还有许多其他方法可以解决此问题。要点是:呈现错误与控制器服务引发的http异常不同。您必须确保尽管存在这些缺失/错误的变量也可以呈现模板,或者在呈现模板之前处理这些缺失的参数,例如在事件监听器中。