我想在Controller中为一个Action配置多个URL(国际化目的)。
根据这个answer,在symfony2中肯定可以:
但我使用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 #}
有人找到了解决这个问题的正确方法吗?
答案 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”)。
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上的魅力一样。