2014-12-03 107 views
1

我放弃了。Symfony 2和Twig自定义错误页面

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

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

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

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

然后我决定深入挖掘,发现了几十个听众(语言环境听众,例外情况,...),并试图在那里调试/修复/测试,但我没有进一步处理。

顺便说一句,我已经覆盖了500错误页面,并且一切都很好。那么我猜,当引发500错误(异常)时,symfony已经设置了用户/ locale/etc,因为它已经到达目标(控制器/动作),并且其他监听器已经执行。但是404错误(NotFoundHttpException)被抛出之前Symfony的目标是动作...

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

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

感谢你的帮助。

+0

问题已解决(尽可能)。解决方案由devilcius提出。 – Dmitry 2014-12-04 11:14:33

回答

2

这是我做(至少404个模板)的方式:

应用程序/配置/ 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)); 

    } 
} 

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

+0

感谢您的想法!我想我会选择这个答案作为接受的:) – Dmitry 2014-12-04 11:13:43

+0

顺便说一句,你可以在这里抛出一个NotFoundHttpException()而不用渲染模板。 – Dmitry 2014-12-04 11:28:40

+0

是的,我知道。但是,如何将'user'传递给模板? – devilcius 2014-12-04 11:52:22

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 
    } 
} 
+0

正确。但我希望这个解决方案将成为我选择的最后一个。不管怎么说,还是要谢谢你。 – Dmitry 2014-12-04 11:13:17