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

Dam*_*nic 7 php routing locale annotations symfony

我正在尝试使用表示当前区域设置的子域来设置路由系统.路由是通过@Routing注释设置的,如下所示:

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

适用于URL的类似en.somedomain.comde.somedomain.com,但无法找到正确的路由somedomain.com,没有区域设置.

我理解,因为host参数,设置为表示确切的locale.domain模式,但我找不到告诉Symfony路由系统可能有额外的默认方式host.

周围搜索了这一点,但没有发现什么特别的.非常感谢任何帮助!

UPDATE

实际上有一种方法可以通过@Route在注释中添加另一个而不使用host参数来实现:

/**
 * @Route(
 *      "/",
 *      name="homepage_default",
 *      defaults={"locale" = "en"}
 * )
 */
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*nic 5

好吧,看起来像三重注释路由来处理locale + subdomain是现在唯一的选择.

学习文档(例如,本文)表明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%"}
 * )
 */
Run Code Online (Sandbox Code Playgroud)

请注意,顺序很重要,从子域开始,下降到默认值.由于@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%" }
Run Code Online (Sandbox Code Playgroud)

订购也是如此.也许有人会遇到并使用它.