如何使用Symfony3

时间:2016-05-05 06:34:49

标签: php internationalization symfony

我想在Controller中为一个Action配置多个URL(国际化目的)。

根据这个answer,在symfony2中肯定可以:

  1. 制作双重注释路线。
  2. 使用第三方套装(例如" BeSimple's")。
  3. 但我使用Symfony 3.0.3 禁止我这样做,直到我更改路线的名称(例如):

    /**
     * @Route("/welcome", name="welcome", defaults={"_locale" = "en"})
     * @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"})
     * @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"})
     */
    

    但添加额外的" FR / DE"路线的字符会改变它们的存在并破坏我的URL在模板中生成逻辑,我被迫在所有链接上制作:

    {# homepage example #}
    
    {% if _locale = 'en' %}
       {{ path('welcome') }}   {# Routes from set only for "en" #}
    {% elseif _locale = 'fr' %}
       {{ path('welcomeFR') }} {# "fr" only links #}
    {% endif %} {# and so on #}
    

    有人找到了解决这个问题的正确方法吗?

2 个答案:

答案 0 :(得分:1)

AFAIK,这是将多个路由指向唯一控制器操作的首选方法。因此,您当前的问题是重新生成当前路径,具体取决于正在使用的路由

如果您使用{{app.request.get('_ route')}}来获取当前路由的名称,也许您不必修改逻辑。这样,您可以使用:

{{ path(app.request.get('_route')) }}

更新:

如何为每条路线创建一个动作并将它们转发到主要语言动作?也许这不是最好的做法,但可以正常工作

/**
 * @Route("/welcome", name="welcome", defaults={"_locale" = "en"})
 */
public function welcomeAction()
{
    /* code here */
}
/**
 * @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"})
 */
public function welcomeFrAction()
{
    $response = $this->forward('AppBundle:ControllerName:welcome');
}

/*
 * @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"})
 */
public function welcomeDeAction()
{
    $response = $this->forward('AppBundle:ControllerName:welcome');
}

答案 1 :(得分:0)

在Symfony3上找到解决方案浪费了10个小时后,我做出了这些假设:

  • 完全相同的“名称”的路线技巧都不起作用

任何类似双重注释,双“routing.yml”导入,基于主机的匹配都会产生相同的效果 - 只匹配一条路线,通常是最后一条。在我的例子中将是(“/ willkommen”,name =“welcomeDE”)。

  • 通过版本控制约束,Symfony3上的两个i18n软件包无法正常工作

Composer甚至不允许我们安装捆绑包。

  • 区域设置侦听器和加载器(路由组件)正在缓存

我的解决方案匹配“_locale”并将其传递给LocaleLoader以分别加载“routing_en.yml / routing_fr.yml”等文件,在Symfony的第一场比赛中缓存,之后,更改“ _locale“不影响路线的映射。

总结

Symfony3似乎不支持具有多个“url”的路由“示例”。通过约束和缓存。

在失望之后,我正在考虑回到Symfony 2.8,不知道是什么指向Symony的主人阻止“双注释”解决方案以及他们目前关于链接国际化的想法

希望有一天能够用S3实现,因为链接i18n是相当常见的SEO实践。

编辑: 确认,使用BeSimple的i18n就像2.8.5上的魅力一样。