我想在Controller中为一个Action配置多个URL(国际化目的)。
根据这个答案,在符号2中肯定有可能:
- 制作双注释管线
- 使用第三方捆绑包(例如"BeSimple's")
但我使用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 #}
有人找到这个问题的正确解决方案吗?
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');
}
在Symfony3上浪费了10个小时寻找解决方案后,我做出了以下假设:
- 没有一个路线技巧与完全相同的";name"不起作用
任何一种类似双注释,双";路由.yml";导入时,基于主机的匹配会产生相同的效果-只有一条路由匹配,通常是最后一条。在我的例子中会是("/willkommen",name="welcomeDE")。
- 两个i18n捆绑包都不能通过版本控制约束在Symfony3上运行
Composer甚至不让我们安装捆绑包。
- Locale Listener and Loader(Routing Component)正在缓存
我的解决方案是匹配"_区域设置";并将其传递给LocaleLoader;routing_en.yml/routing_fr.yml";等文件分别被Symfony缓存在第一次匹配之后_区域设置";不会影响路线的映射。
总结
Symfony3似乎不支持路由";示例";其中多于一个";url";完全通过约束和缓存。
在失望之后,我正在考虑回到Symfony 2.8,不知道是什么让Symony的大师们阻止";双注释";解决方案以及他们目前对链接国际化的想法是什么。
希望有一天可以用S3实现,因为链接i18n是非常常见的SEO实践。
编辑:已确认,使用BeSimple的i18n在2.8.5上运行得很有魅力