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)),
);
}
}
任何人都可以解释以下三点:
return
如果! $request->hasPreviousSession()
?if/else
中,为什么他们在$request->getSession()->set('_locale')
区块中设置了if
的区域设置?为什么不在$request->setLocale()
块中使用else
?答案 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
可能在请求中 - 例如当用户更改区域设置 - 在这种情况下将会话对象更新为新值。)
回答你的问题。
如果没有会话对象,则跳过因为事件是多余的(值不能在会话中,因为它不存在)。
在会话和请求之间同步_locale
的值,支持请求的版本。
由于LocaleListener事件处理区域设置问题,因此需要在该事件运行之前进行上述操作。 OnKernelRequest是最先触发的事件之一,因此我们可以确定是这种情况。