基本树枝模板忽略Symfony2语言环境

时间:2016-04-15 13:35:10

标签: php symfony twig listener translation

情况

我在监听kernel.request上的监听器上设置语言环境,如下所示:

<?php
// ...
class LocaleListener
{
    //...
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$event->isMasterRequest()) {
            return;
        }

        // [...] some logic to get $locale
        $request->setLocale($locale);
    }
}
?>

然后,我有两个树枝模板,一个基础和一个基础扩展模板。基本模板(base.html.twig):

<html>
<body>
    {{ 'some.translation'|trans({}, 'messages') }}

    {% block body %}{% endblock %}
</body>
</html>

基础扩展模板(profile.html.twig):

{% extends '::base.html.twig' %}

{% block body %}
    {{ 'some.translation'|trans({}, 'messages') }}
{% endblock %}

路线的控制器将呈现profile.html.twig:

<?php
// ...
class SomeController extends Controller
{
    //...
    public function someAction()
    {
        return $this->render('::profile.html.twig');
    }
}
?>

没什么特别的,都非常简单......

问题

扩展基础(profile.html.twig)的呈现模板使用侦听器中转换集的语言环境。不幸的是,基本模板(base.html.twig)不是。即使我在基础模板上转储{{ dump(app.request.locale) }},它也会在监听器中显示正确的区域设置...

我想念什么?

修改

哦,我正在使用Symfony v2.7.11。

1 个答案:

答案 0 :(得分:1)

工作解决方案:完全按照记录的here创建LocaleListener(Yoshi提示)。

附录:我希望使用存储在用户实体中的语言环境,因此我必须创建InteractiveLoginListenerclass file)。从版本1.3.6开始,有一个名为security.interactive_login的事件(如2.0-alpha,即使没有记录),必须注入:

app.interactive_login_listener:
    class: AppBundle\EventListener\Security\InteractiveLoginListener
    arguments: ['@fos_user.user_manager', '@session']
    tags:
        - { name: 'kernel.event_listener', event: 'security.interactive_login', method: 'onSecurityInteractiveLogin' }