解释Symfony的“粘性”语言环境事件监听器

时间:2015-06-14 13:44:16

标签: php symfony events locale

Symfony的食谱为make the locale "sticky" during a user's session提出了以下方法:

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

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

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

        // try to see if the locale has been set as a _locale routing parameter
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

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

任何人都可以解释以下三点:

  1. 他们为什么return如果! $request->hasPreviousSession()
  2. 在以下if/else中,为什么他们在$request->getSession()->set('_locale')区块中设置了if的区域设置?为什么不在$request->setLocale()块中使用else
  3. 在<默认区域设置侦听器之前必须注册“”究竟是什么意思?

1 个答案:

答案 0 :(得分:1)

此事件会使val X = 2 something match { case (X, y) => // matches if `something` is a pair whose first member is 2, and assigns the second member to `y` case (x, y) => // matches if `something` is a pair, and extracts both `x` and `y` } 看起来像当前请求一样提交,即使它实际上可能来自会话(但_locale可能在请求中 - 例如当用户更改区域设置 - 在这种情况下将会话对象更新为新值。)

回答你的问题。

  1. 如果没有会话对象,则跳过因为事件是多余的(值不能在会话中,因为它不存在)。

  2. 在会话和请求之间同步_locale的值,支持请求的版本。

  3. 由于LocaleListener事件处理区域设置问题,因此需要在该事件运行之前进行上述操作。 OnKernelRequest是最先触发的事件之一,因此我们可以确定是这种情况。