Symfony在服务中投放自定义404页面

问题描述 投票:0回答:1

我需要在服务中抛出一个Exception

        $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或任何其他Exception类型显示404页面

谢谢

php symfony
1个回答
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异常。您必须确保尽管存在这些丢失/错误的变量,仍可以渲染模板,或者在渲染模板之前处理这些缺失的参数,例如:在事件监听器中。

© www.soinside.com 2019 - 2024. All rights reserved.