【问题标题】:Symfony override _locale parameterSymfony 覆盖 _locale 参数
【发布时间】:2016-06-04 22:12:31
【问题描述】:

我已经创建了一个自定义的 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 的 URL(例如:/en 而不是自动 /de)。

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

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    在这种情况下你需要添加 RedirectResponse

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

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

    【讨论】:

    • 感谢您的回复。但我需要得到$params?我也认为这会创建一个重定向循环。如果$lang 不等于$_locale,我们只需要重定向。结论:我们还需要从路由器中获取$params$_locale
    • $params 你可以从 $request->query->all(); $locale 表单 $request->getLocale()
    • 那么 $_locale 会破坏循环吗?
    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多