我放弃了。
问题在于覆盖的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
感谢您的帮助。
答案 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
}
}