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%"}
* )
*/
适用于 en.somedomain.com
或 de.somedomain.com
等 URL,但无法为 somedomain.com
找到正确的路由,没有区域设置。
我明白,由于 host
参数,它被设置为表示精确的 locale.domain 模式,但我找不到方法来判断Symfony路由系统,可以有额外的,默认host
。
四处搜索,但没有发现任何特别的东西。非常感谢任何帮助!
更新
实际上有一种方法可以做到这一点,通过在注释中添加另一个 @Route
,没有 host
参数:
/**
* @Route(
* "/",
* name="homepage_default",
* defaults={"locale" = "en"}
* )
*/
但这看起来有点脏,我没有在那里使用 %domain%
参数,这对我来说很重要 - 比如说,如果我需要另一个子域用于移动版本。
我刚刚遇到了类似的默认问题,尽管它是一个路由参数而不是语言环境。
解决方案是用 : 替换 = 符号,因为它应该是这样的,编译器不会以某种方式抱怨它。
所以试试这个:
/**
* @Route(
* "/",
* name="homepage",
* host="{locale}.{domain}",
* defaults={"locale" : "en", "domain" : "%domain%"},
* requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
* )
*/
嗯,看起来处理语言环境 + 子域的三重注释路由是目前唯一的选择。
研究文档(例如,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%" }
也下单了。也许有人会遇到并使用它。
我正在尝试使用代表当前语言环境的子域设置路由系统。路由通过 @Routing
注释设置,如下所示:
/**
* @Route(
* "/",
* name="homepage",
* host="{locale}.{domain}",
* defaults={"locale" = "en", "domain" = "%domain%"},
* requirements={"locale" = "en|de|fr", "domain" = "%domain%"}
* )
*/
适用于 en.somedomain.com
或 de.somedomain.com
等 URL,但无法为 somedomain.com
找到正确的路由,没有区域设置。
我明白,由于 host
参数,它被设置为表示精确的 locale.domain 模式,但我找不到方法来判断Symfony路由系统,可以有额外的,默认host
。
四处搜索,但没有发现任何特别的东西。非常感谢任何帮助!
更新
实际上有一种方法可以做到这一点,通过在注释中添加另一个 @Route
,没有 host
参数:
/**
* @Route(
* "/",
* name="homepage_default",
* defaults={"locale" = "en"}
* )
*/
但这看起来有点脏,我没有在那里使用 %domain%
参数,这对我来说很重要 - 比如说,如果我需要另一个子域用于移动版本。
我刚刚遇到了类似的默认问题,尽管它是一个路由参数而不是语言环境。
解决方案是用 : 替换 = 符号,因为它应该是这样的,编译器不会以某种方式抱怨它。
所以试试这个:
/**
* @Route(
* "/",
* name="homepage",
* host="{locale}.{domain}",
* defaults={"locale" : "en", "domain" : "%domain%"},
* requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
* )
*/
嗯,看起来处理语言环境 + 子域的三重注释路由是目前唯一的选择。
研究文档(例如,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%" }
也下单了。也许有人会遇到并使用它。