Symfony 路由 - 区域设置作为子域,回退到默认值


Symfony routing - locale as subdomain with fallback to default

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

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

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

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

处寻找这个,但没有发现什么特别的。将不胜感激任何帮助!

更新

实际上有一种方法可以做到这一点,通过在注释中添加另一个@Route,而无需host参数:

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

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

好吧,看起来处理区域设置 + 子域的三重注释路由是目前唯一的选择。

研究文档(例如,这篇文章)表明,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%" }

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

我刚刚在默认值方面遇到了类似的问题,尽管它是一个路由参数而不是区域设置。

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

所以试试这个:

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