Symfony3在Deeplink中添加语言环境

时间:2018-10-29 00:40:53

标签: symfony locale symfony-3.4

我按照https://symfony.com/doc/current/setup.html的官方symfony文档中的“入门”部分,在symfony3中创建了一个新站点。

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

我的问题是,是否存在一种方法,如果用户对mydomain.com/blog进行深层链接,框架会发现本地不存在,因此可以将URL添加并将其转换为mydomain.com/en/blog < / p>

我没有添加代码,因为它是默认代码。让我知道您是否需要它。

2 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点。可能最简单的方法是让一个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-negotiation
  4. 重定向,将语言环境作为属性添加到请求中,将当前设置的语言写入Cookie,或执行其他任何更改路线所需的操作

答案 1 :(得分:1)

感谢@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);
                }
            }
        }
    }