Symfony 4.1 i18n路由前缀:如何排除指定路由?
解决Symfony 4.1多语言路由冲突的方案
我来帮你搞定这个问题——核心思路就是把「选择语言」的路由从全局多语言前缀规则里单独剥离出来,让它直接响应/路径,同时让其他所有路由正常带上/fr/或/en/前缀。下面是具体实现步骤:
1. 拆分路由配置文件
首先修改config/routes/annotations.yaml,把路由分成不带前缀的语言选择路由和带多语言前缀的通用路由两部分:
# config/routes/annotations.yaml # 第一部分:单独配置语言选择页面,不适用全局前缀 language_selector: resource: '../src/Controller/LanguageSelectorController.php' type: annotation # 第二部分:给其他所有控制器添加多语言前缀 app: resource: '../src/Controller/' type: annotation prefix: '/{_locale}' requirements: _locale: 'fr|en' # 限定允许的语言代码
2. 编写语言选择控制器
创建专门的语言选择控制器,直接把路由注解设为/,不需要任何前缀:
// src/Controller/LanguageSelectorController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class LanguageSelectorController extends AbstractController { /** * @Route("/", name="language_selector") */ public function index() { // 渲染选择语言的页面 return $this->render('language_selector/index.html.twig'); } }
3. 编写带多语言前缀的其他控制器
比如首页控制器,路由注解只需要写/,结合全局配置的前缀,就会自动生成/fr/和/en/的路径:
// src/Controller/HomeController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class HomeController extends AbstractController { /** * @Route("/", name="homepage") */ public function index() { return $this->render('home/index.html.twig'); } }
其他业务控制器同理,比如FooController的路由:
/** * @Route("/foo", name="foo_page") */ public function foo() { return $this->render('foo/index.html.twig'); }
它会自动映射到/fr/foo和/en/foo路径。
4. 页面跳转与路由生成
在语言选择页面的模板里,你可以这样生成对应语言的首页链接:
{# templates/language_selector/index.html.twig #} <a href="{{ path('homepage', {_locale: 'fr'}) }}">Français</a> <a href="{{ path('homepage', {_locale: 'en'}) }}">English</a>
这样用户点击后就会跳转到带语言前缀的首页。
验证效果
- 访问
/:进入语言选择页面 - 访问
/fr/:进入法语首页 - 访问
/en/:进入英语首页 - 访问
/fr/foo:进入法语版的foo页面 - 访问
/en/foo:进入英语版的foo页面
完全符合你想要的路由结构!
内容的提问来源于stack exchange,提问作者enguerranws
相关产品推荐
相关产品推荐

