Symfony 2和Twig自定义错误页面

时间:2014-12-03 16:28:30

标签: symfony twig http-status-code-404

我放弃了。

问题在于覆盖的Twig 404模板。通过在/ app / Resources / TwigBundle / views目录下创建error404.html.twig,以默认方式覆盖它。

模板本身不包含任何不规则或复杂的逻辑:只是包含一些翻译文本(| trans)的布局和包含多个链接的菜单。

问题是,我无法在此模板中获取app.user对象(返回为NULL)或当前app.request.locale(始终作为默认语言环境返回)。

我甚至试图覆盖twig异常控制器并转储当前的语言环境(Request :: getLocale())或获取用户 - 结果是相同的 - 默认语言环境和用户的NULL。

然后我决定深入挖掘并发现了几十个听众(语言环境监听器,异常启动器......)并尝试在那里进行调试/修复/测试,但我没有继续进行。

顺便说一下,我也覆盖了500错误页面,那里的一切都很好。好吧,我想当抛出500错误(异常)时,symfony已经设置了user / locale / etc,因为它已经到达目标(控制器/动作)并且已经执行了其他侦听器。但是在Symfony定位动作之前,会抛出404错误(NotFoundHttpException)......

关于项目的一些话:symfony 2.4.8,doctrine,Gedmo extensions / stof bundle,JMS i18n routing bundle。

Symfony版本:v2.4.8 JMS I18n路由包:1.1.1

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这就是我的方式(至少对于404模板):

app / config / routing.yml 中附加:

#always in last position
#------------>
nonexistent_route:
    path:     /{url}
    defaults: { _controller: ACMEDemoBundle:Default:wrongRoute}
    requirements:
        url: ".+"    
#<-----------

控制器:

namespace ACME\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class DefaultController extends Controller
{
    ...

    public function wrongRouteAction($url)
    {
        $user = $this->get('security.context')->getToken()->getUser();

        return $this->render('TwigBundle:Exception:error404.html.twig', array("user" => $user, "url" => $url));

    }
}

在您的twig模板app / Resources / TwigBundle / views / Exception / error404.html.twig中,您可以访问{{ user }}

答案 1 :(得分:1)

您可以在KernelException事件上创建注册侦听器,并定义您需要的任何逻辑。像这样:

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class YourKernelExceptionListener
{
    public function onKernelExcpetion(GetResponseForExceptionEvent $event)
    {
        // if the exception is instance of Symfony NotFoundHttpException
        // you can do whatever you need and render whatever you need
    }
}