Symfony3在deeplink中添加区域设置

Symfony3在deeplink中添加区域设置,symfony,locale,symfony-3.4,Symfony,Locale,Symfony 3.4,我在symfony官方文档中的入门部分之后,在symfony 3中创建了一个新站点 一切正常。。如果我将mydomain.com作为URL,框架将添加/en或正确的本地地址 我的问题是,如果用户对mydomain.com/blog进行深度链接,框架是否会发现本地文件不存在,从而可以添加url并将其转换为mydomain.com/en/blog 我没有添加代码,因为它是默认代码。如果您需要,请告诉我。有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener

我在symfony官方文档中的入门部分之后,在symfony 3中创建了一个新站点

一切正常。。如果我将mydomain.com作为URL,框架将添加/en或正确的本地地址

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


我没有添加代码,因为它是默认代码。如果您需要,请告诉我。

有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener捕获请求而不使用区域设置,然后处理添加该信息的操作。由于您的项目基于演示应用程序,您可能希望了解他们的解决方案:

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

  • 收听
    内核。请求
    事件
  • 根据某些条件提前返回,例如主页、设置了该语言的cookie或其他内容
  • 通过获取默认区域设置或根据可用区域设置和浏览器标题确定最适合哪种语言来检测语言(请参阅:)
  • 重定向、将区域设置作为属性添加到请求、将当前设置的语言写入cookie,或者执行任何更改路由所需的操作

  • 有多种方法可以做到这一点。可能最简单的方法是使用EventSubscriber或-Listener捕获请求而不使用区域设置,然后处理添加该信息的操作。由于您的项目基于演示应用程序,您可能希望了解他们的解决方案:

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

  • 收听
    内核。请求
    事件
  • 根据某些条件提前返回,例如主页、设置了该语言的cookie或其他内容
  • 通过获取默认区域设置或根据可用区域设置和浏览器标题确定最适合哪种语言来检测语言(请参阅:)
  • 重定向、将区域设置作为属性添加到请求、将当前设置的语言写入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);
                    }
                }
            }
        }
    

    多亏了@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);
                    }
                }
            }
        }
    

    谢谢你的帮助为我指出了解决办法!(我在下面贴了)感谢您发布修改后的解决方案。这将有助于任何人发现问题需要一个更具体的例子。谢谢!你的帮助为我指出了解决办法!(我在下面贴了)感谢您发布修改后的解决方案。这将有助于任何人找到需要更具体例子的问题。