php - Symfony 路由 - 语言环境作为子域,回退到默认

标签 php routing annotations locale symfony

我正在尝试使用代表当前语言环境的子域设置路由系统。路由通过 @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% 参数,这对我来说很重要——比如说,如果我需要另一个子域用于移动版本。

最佳答案

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

研究文档(例如,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%" }

也下单了。也许有人会遇到并使用它。

关于php - Symfony 路由 - 语言环境作为子域,回退到默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815312/

相关文章:

php - 在php mysql中显示类别和子类别

angular - 为什么 routerLink 和 router.navigate() 行为不同?

spring - @PostConstruct 在 Grails 服务上默默失败

java - 如何在 ContainerRequestFilter 中检索请求的匹配资源

php - 是什么导致 $model->attributes 在 Yii 中得不到正确的值?

javascript - HTML 表单不会创建新条目

networking - 主机路由表的理解

Laravel 路由模型绑定(bind) 500 错误

java - 定义注解只适用于静态方法

php - 如果第一个查询没有返回结果,则使用第二个查询