Symfony覆盖_locale参数

时间:2016-06-04 22:12:32

标签: php symfony

我创建了一个自定义LocaleListener:

class LocaleListener implements EventSubscriberInterface
{
    public function onKernelRequest(GetResponseEvent $event)
    {    
        if ($request->getSession()->get("language")) {
            $lang = $request->getSession()->get("language");
        } else {
            $lang = $request->getPreferredLanguage(array("de", "en"));
        }

        $request->getSession()->set('_locale', $lang);
        $request->setLocale($request->getSession()->get('_locale', $lang));
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

我从会话(如果存在)或浏览器中获取语言代码。现在我想纠正/操纵路线。我在路由器中使用_locale来设置语言代码(ende)。现在我想覆盖用户的选择。

例如,LocaleListener中的语言代码为de。用户现在会请求_locale = en(例如:/en而非自动/de)的网址。

如何通过监听器或其他解决方案强制将用户_locale设置为每个控制器外LocaleListener的结果?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要添加RedirectResponse

$event->setResponse(new RedirectResponse($request->getBaseUrl().'/'.$locale.'/'.($params ? '?'.http_build_query($params) : '')));

或使用JMSI18nRoutingBundle https://github.com/schmittjoh/JMSI18nRoutingBundle