我通过内核异常触发的事件监听器设置了404错误页面:
public function onKernelException(GetResponseForExceptionEvent $event)
{
if ($event->isMasterRequest()) {
$exception = $event->getException();
if ($exception instanceof NotFoundHttpException) {
$response = new Response();
$event->setResponse(
$response->setContent($this->templating->render(
'LandingPageBundle:Error:error404.html.twig',
['welcome_url' => $this->router->generate("welcome")]
))
);
}
}
}
kernel.kernel_exception_listener:
class: S\Project\LandingPageBundle\EventListener\KernelExceptionListener
arguments: [ "@router", "@logger", "@translator", @templating ]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
这样可行,但是当我尝试在twig error404.html.twig模板上使用trans过滤器时,它什么都不做。我的语言环境设置在cookie中,并由事件监听器读取内核请求,因此我尝试将以下内容添加到onKernelException:
$request = $event->getRequest();
$locale = $request->cookies->get('_locale');
$request->setLocale($locale);
之后,在模板中包含{{ app.request.locale }}
显示正确的区域设置,但是,trans过滤器似乎没有选择它。
似乎我的问题可能与Symfony 2.1 set locale有关,但这个问题并不完全符合我的确切问题,而且我不确定如何解决问题。理想情况下,我的内核请求侦听器可以在onKernelException之前触发,以便它可以事先正确设置语言环境,但是目前似乎在404期间没有触发内核请求事件。我看了http://symfony.com/doc/current/components/http_kernel/introduction.html以便更好地理解Symfony的请求序列,但我不是很清楚在一个错误的请求中发生的序列,但看起来在异常的情况下,它会跳过大部分请求流并直接进入响应,并且我记得来自http://symfony.com/doc/current/book/translation.html#handling-the-user-s-locale
“在控制器中使用$ request-> setLocale()设置语言环境为时已晚,无法影响翻译器。可以通过监听器(如上所述)设置语言环境,URL(参见下一个)或调用setLocale()直接在翻译服务上。“
有没有办法在模板化的404页面上使用反式过滤器?
答案 0 :(得分:2)
尝试注入@translator
并使用其方法setLocale
。
[' welcome_url' => $这 - >路由器 - >生成("欢迎&#34)]
为什么你在听众中创建链接?您应该使用名为path
的twig函数在模板中执行此操作。