Symfony2 Controller事件监听器会话覆盖

时间:2014-06-14 14:53:44

标签: php symfony

我正在尝试实施多语种网站。语言是克罗地亚语,英语和德语。在多语言网站中,网址也必须使用不同的语言。所以,如果克罗地亚网址是......

www.example.com/hr/o-nama

英语必须是......

www.example.com/en/about-us

据我所知,Symfony没有这样做的组件。但这不是问题所在。我已设法使用存储当前和上一个区域设置(enhrde)的对象来解决该问题,因此当区域设置发生更改时,网站会被重定向到包含相应的区域设置。例如,特定于语言的路由的名称为some_bundle_route_ensome_bundle_route_hr。因此,如果当前区域设置为hr且区域设置已更改,则网站会重定向到some_bundle_route_en

这是我实现此系统的Controller事件监听器中的代码......

$controller = $event->getController();

    if ( ! is_array($controller)) {
        return;
    }

    if($session->has('prev-locale')) {
        $prevLocale = $session->get('prev-locale');
        if($prevLocale != $locale) {
            $session->set('prev-locale', $locale);
            $redirectUrl = $router->generate($this->generateWantedRoute($this->request->get('_route'), $locale));
            $event->setController(function() use ($redirectUrl) {
                return new RedirectResponse($redirectUrl);
            });

            return;
        }
    }
    else {
        $session->set('prev-locale', $locale);
    } 

这是程序流程:(让我们说当前的语言环境是hr

  1. 如果未设置prev-locale,请将其设置为当前区域设置。
  2. 如果设置了prev-locale,请检查区域设置是否已更改。
  3. 如果区域设置已更改,请将prev-locale设置为当前区域设置并重定向到some_bundle_route_en
  4. 问题是prev-locale无缘无故地变为en。我已经彻底调试了它,并且如果prev-locale和当前区域设置不同,那么区域设置将改变的唯一方式。

    首次加载页面时,prev-localehr,当前区域设置($locale)也为hr。但是,如果我再次刷新页面,prev-locale得到了更改。

    现在,the strangest thing is,如果我将相同的代码从事件监听器复制/粘贴到当前正在执行的控制器,则代码可以正常工作。没有会话问题或奇怪的覆盖。

    因此,如果您正在考虑回答此问题,请记住,此相同的代码在控制器中有效,但在事件侦听器中无效。

    我知道这是一个很长的问题,所以任何试图回答它的人都会得到我永恒的感激之情。

0 个答案:

没有答案