TLD的Symfony2语言

use*_*102 10 locale listener symfony

我是Symfony2的新手,我正在寻找选择我的主机名TLD的语言.(以适当的方式)

我已经找到了一些方法来改变语言的形式:http://symfony.com/blog/play-with-the-user-language

但我需要能够在新用户连接时选择语言:

  • www.hostname.fr => fr
  • www.hostname.it =>它
  • www.hostname.co.uk => en

现在我添加一个触发每个请求的服务侦听器:

services:
    kernel.listener.domain_langue_listener:
        class: acme\DemoBundle\Listener\DomainLangueListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
Run Code Online (Sandbox Code Playgroud)

上课:

namespace acme\DemoBundle\Listener;
class DomainLangueListener
{
    public function onDomainParse(Event $event)
    {
        $request = $event->getRequest();
        $session = $request->getSession();

        preg_match('/[^.]+$/', $request->getHost(), $match);
        $session->setLocale($match[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个监听器有效,但我想使用一些参数来定义哪个TLD与哪种语言匹配,但在监听器中我不能像这样访问容器:

$this->container->getParameter('tld_allowed');
Run Code Online (Sandbox Code Playgroud)

我想知道是否有另一种方法来访问监听器中的参数或以其他方式选择具有主机名的语言

谢谢你的回答.

igo*_*orw 7

你快到了.你现在唯一要做的就是使用"arguments"(构造函数的参数)将参数注入你的监听器.%foobar%指"foobar"参数,@foobar指的是"foobar"服务.

parameters:
    tld_allowed: en,fr,de

services:
    kernel.listener.domain_langue_listener:
        class: acme\DemoBundle\Listener\DomainLangueListener
        arguments:
            - %tld_allowed%
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
Run Code Online (Sandbox Code Playgroud)

而听众:

namespace acme\DemoBundle\Listener;
class DomainLangueListener
{
    public function __construct($tldAllowed)
    {
        $this->tldAllowed = $tldAllowed;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)