Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在会话期间配置Symfony2粘性区域设置_Php_Symfony_Locale_Multilingual - Fatal编程技术网

Php 如何在会话期间配置Symfony2粘性区域设置

Php 如何在会话期间配置Symfony2粘性区域设置,php,symfony,locale,multilingual,Php,Symfony,Locale,Multilingual,我想翻译我的网站感谢在右上方的链接 我发现,自symfony2.1以来,区域设置不再存储在会话中 因此,我遵循了Symfony文档: …Bundle/Service/LocaleListener.php class LocaleListener implements EventSubscriberInterface { private $defaultLocale; public function __construct($defaultLocale) {

我想翻译我的网站感谢在右上方的链接

我发现,自symfony2.1以来,区域设置不再存储在会话中

因此,我遵循了Symfony文档:

…Bundle/Service/LocaleListener.php

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale)
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {

        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
              return;
        }

        $locale = $request->attributes->get('_locale');
        var_dump($locale);

        if ($locale) {
             $request->getSession()->set('_locale', $locale);
        } else {
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

    static public function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}
…Bundle/Resources/config/services.yml

locale_listener:
    class: ..Bundle\Service\LocaleListener
    arguments: ["%kernel.default_locale%"]
    tags:
        - { name: kernel.event_subscriber }   
framework:
    translator:      { fallback: en }
/app/config/config.yml

locale_listener:
    class: ..Bundle\Service\LocaleListener
    arguments: ["%kernel.default_locale%"]
    tags:
        - { name: kernel.event_subscriber }   
framework:
    translator:      { fallback: en }
并且,我添加了两个链接来在父细枝模板上翻译我的网站,如下所示()

base.html.twig

<li><a href="{{-
                path(app.request.get('_route'),
                app.request.get('_route_params')|merge({'_locale' : 'fr'}))
            -}}">FR</a></li>
<li><a href="{{-
                path(app.request.get('_route'),
                app.request.get('_route_params')|merge({'_locale' : 'en'}))
            -}}">EN</a></li>
因此,
\u locale
参数的值是
fr
。因此,我的网站应该翻译成法语

然而,

var_dump($locale)
在侦听器中,将显示三次:

  • 空的

  • 空的 我不明白为什么
    \u locale
    参数在显示
    null
    时找不到,为什么
    en


  • 使用侦听器,您将捕获所有不需要的请求和子请求。这就解释了三次幻影

    尝试将以下代码添加到
    onKernelRequest
    方法中:

    if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
        return;
    }
    

    这将避免子请求,并可能解决您的问题。

    好的,我在onKernelRequest方法的顶部添加了它。现在,我只显示了两个“null”。。但这并不能解决我的问题。在我的侦听器中,我使用
    $request->get('u locale')
    而不是
    $request->attributes->get('u locale')
    ,你能试试吗?好的。现在,它在每个实例中都显示“en”,尽管url是
    满意度?\u locale=fr
    。。。(顺便说一句,感谢您的帮助)如注释所示,您的区域设置侦听器必须在默认区域设置侦听器之前注册。在我的Symfony 2.3项目中,默认的区域设置listner的优先级为16。尝试将侦听器的优先级更改为10,例如,或更低…这里是我的区域设置侦听器,如果您想检查:我在其上添加了数据库区域设置存储功能,您可以忽略此项。
    \u locale
    应该是url层次结构的一部分,如
    example.com/{u locale}/suitation
    而不是GET参数(
    example.com/successment?\u locale=fr