服务内部的Symfony Throw自定义404页面

时间:2018-08-31 11:43:09

标签: php symfony

我需要在服务内部抛出异常

        $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页面

谢谢

1 个答案:

答案 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异常不同。您必须确保尽管存在这些缺失/错误的变量也可以呈现模板,或者在呈现模板之前处理这些缺失的参数,例如在事件监听器中。