Symfony3在深度链接中添加区域设置



我在symfony 3中创建了一个新站点,遵循中的官方symfony文档中的入门部分https://symfony.com/doc/current/setup.html

一切都很好……如果我把mydomain.com作为URL,框架就会添加/en或正确的本地。

我的问题是,如果用户对mydomain.com/blog进行深度链接,框架会发现本地不存在,因此可以添加url并将其转换为mydomain.com/en/blog

我不会添加代码,因为它是默认的代码。如果你需要,请告诉我。

有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener来捕获不带区域设置的请求,然后处理添加该信息。由于您的项目基于演示应用程序,您可能需要查看他们的解决方案:https://github.com/symfony/demo/blob/master/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php

在事件处理程序中执行的步骤大致如下:

  1. 收听kernel.request事件
  2. 根据某些条件提前返回,例如主页、设置了语言的cookie或其他内容
  3. 通过获取默认区域设置或从可用区域设置和浏览器标题中确定最适合哪种语言来检测语言(请参阅:https://github.com/willdurand/Negotiation#language-协商(
  4. 重定向,将区域设置添加为要请求的属性,将当前设置的语言写入cookie,或者执行更改路由所需的其他操作

感谢@dbrumann,我得到了这个解决方案。。。当然,使用更少的代码是可以改进的,但它确实做到了。

我更新了RedirectToPreferredLocaleSubscriber类中的onKernelRequest方法

public function onKernelRequest(GetResponseEvent $event): void
{
$request = $event->getRequest();
$path = explode('/',$request->getPathInfo());
$hasLocale = false;
foreach ($this->locales as $key => $l) {
if($l == $path[1]){
$hasLocale = true;
}
}
if(!$hasLocale){
// Ignore sub-requests and all URLs but the homepage
if (!$event->isMasterRequest() || '/' !== $request->getPathInfo()) {
$preferredLanguage = $request->getPreferredLanguage($this->locales);
if ($preferredLanguage !== $this->defaultLocale) {
$url = "";
foreach ($path as $key => $p) {
if($key > 0){
$url .= "/" . $p;
}
}
//print_r('/' . $preferredLanguage . $url);exit;
$response = new RedirectResponse('/' . $preferredLanguage . $url);
$event->setResponse($response);
}
}
else{
// Ignore requests from referrers with the same HTTP host in order to prevent
// changing language for users who possibly already selected it for this application.
if (0 === mb_stripos($request->headers->get('referer'), $request->getSchemeAndHttpHost())) {
return;
}
$preferredLanguage = $request->getPreferredLanguage($this->locales);
if ($preferredLanguage !== $this->defaultLocale) {
$response = new RedirectResponse($this->urlGenerator->generate('homepage', ['_locale' => $preferredLanguage]));
$event->setResponse($response);
}
}
}
}

最新更新