我正在尝试使用表示当前区域设置的子域来设置路由系统。路由是通过@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
等网址,但无法在没有区域设置的情况下找到somedomain.com
的正确路线。
我理解,由于host
参数设置为表示完全 locale.domain 模式,但我找不到告诉Symfony路由系统可能存在的方法另外,默认host
。
为此搜索四周,但没有发现什么特别的。非常感谢任何帮助!
更新
实际上有一种方法可以通过在注释中添加另一个@Route
来实现,而不需要host
参数:
/**
* @Route(
* "/",
* name="homepage_default",
* defaults={"locale" = "en"}
* )
*/
但那看起来有点脏,而且我没有在那里使用%domain%
参数,这对我很重要 - 比方说,如果我需要另一个子域用于移动版本。
答案 0 :(得分:5)
好吧,看起来像三重注释路由来处理locale + subdomain是目前唯一的选择。
学习文档(例如,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%" }
也订购了。也许有人会碰到并使用它。
答案 1 :(得分:0)
我在默认情况下遇到了类似的问题,尽管它是路由参数而不是语言环境。
解决方案是在那里用以下代码替换=符号:因为它应该是这样,并且编译器以某种方式不会抱怨它。
所以试试这个:
/**
* @Route(
* "/",
* name="homepage",
* host="{locale}.{domain}",
* defaults={"locale" : "en", "domain" : "%domain%"},
* requirements={"locale" : "en|de|fr", "domain" : "%domain%"}
* )
*/