【问题标题】:Symfony routing - locale as subdomain with fallback to defaultSymfony 路由 - 语言环境作为子域,回退到默认值
【发布时间】:2015-01-07 08:34:56
【问题描述】:

我正在尝试使用代表当前语言环境的子域来设置路由系统。路由是通过@Routing 注解设置的,如下所示:

/**
 * @Route(
 *      "/",
 *      name="homepage",
 *      host="{locale}.{domain}",
 *      defaults={"locale" = "en", "domain" = "%domain%"},
 *      requirements={"locale" = "en|de|fr", "domain" = "%domain%"}
 * )
 */

适用于 en.somedomain.comde.somedomain.com 之类的 URL,但无法找到 somedomain.com 的正确路径,没有语言环境。

我知道由于 host 参数,它被设置为代表确切的 locale.domain 模式,但我找不到方法告诉 Symfony 路由系统可能有额外的,默认host

四处寻找这个,但没有发现什么特别的。非常感谢任何帮助!

更新

其实有一种方法可以做到,在注解中再加一个@Route,不带host参数:

/**
 * @Route(
 *      "/",
 *      name="homepage_default",
 *      defaults={"locale" = "en"}
 * )
 */

但这看起来有点脏,我没有在那里使用%domain% 参数,这对我来说很重要 - 比如说,如果我需要另一个移动版本的子域。

【问题讨论】:

    标签: php routing annotations locale symfony


    【解决方案1】:

    好吧,看起来处理语言环境 + 子域的三重注释路由是目前唯一的选择。

    研究文档(例如,this article)表明 Symfony 开发人员鼓励我们这样做,对我来说,这不是很好。但是,这是解决方案...

    /**
     * @Method({"GET"})
     * @Route(
     *      "/",
     *      name="homepage",
     *      host="{mobile}.{_locale}.{domain}",
     *      defaults={"mobile" = "moblie", "locale" = "%locale%", "domain" = "%domain%"},
     *      requirements={"mobile" = "mobile|m", "_locale" = "%locale%|de|fr",  "domain" = "%domain%"}
     * )
     * @Route(
     *      "/",
     *      name="homepage",
     *      host="{_locale}.{domain}",
     *      defaults={"_locale" = "%locale%", "domain" = "%domain%"},
     *      requirements={"_locale" = "%locale%|de|fr", "domain" = "%domain%"}
     * )
     * @Route(
     *      "/",
     *      name="homepage_default",
     *      defaults={"_locale" = "%locale%"}
     * )
     */
    

    请注意,顺序很重要,从子域开始,一直到默认。由于 @Route 注释看起来很难看,我决定在 YAML 中也重新编写:

    homepage_locale_mobile:
        path:      /
        host:      "{mobile}.{_locale}.{domain}"
        defaults:  { mobile: "mobile", _locale: "%locale%", domain: "%domain%" }
        requirements:
            mobile:  "mobile|m"
            _locale: "%locale%|de|fr",
            domain:  "%domain%"
    
    homepage_locale:
        path:      /
        host:      "{_locale}.{domain}"
        defaults:  { _locale: "%locale%", domain: "%domain%" }
        requirements:
            _locale: "%locale%|de|fr",
            domain:  "%domain%"
    
    homepage:
        path:      /
        defaults:  { _locale: "%locale%" }
    

    也订购了。也许有人会遇到并使用它。

    【讨论】:

      【解决方案2】:

      我刚刚遇到了与默认值类似的问题,尽管它是一个路由参数而不是语言环境。

      解决方案是用 : 替换 = 符号,因为它应该是这样,编译器不会抱怨它。

      所以试试这个:

      /**
       * @Route(
       *      "/",
       *      name="homepage",
       *      host="{locale}.{domain}",
       *      defaults={"locale" : "en", "domain" : "%domain%"},
       *      requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
       * )
       */
      

      【讨论】:

      • 知道这一点非常有用,但是,我的问题不在于编译器错误;当我请求默认域时,这是 Symfony 的“无法找到正确的路由”异常。问题是我无法定义多个host 参数,例如:host={"{locale}.{domain}", "{domain}"}。最重要的是注释很好并且有效。
      • 我认为问题的原因是 Symfony “看不到”该默认区域设置,这就是它无法匹配到它的路由的原因;因为我之前没有收到任何编译器错误,但我的默认参数不起作用。
      猜你喜欢
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多