Symfony 6路由国际化实现咨询及JMSI18nRoutingBundle兼容问题
Symfony 6 路由国际化实现及常见问题解决
关于JMSI18nRoutingBundle的编译错误
你遇到的编译错误是因为旧版本的JMSI18nRoutingBundle(2.x及以下)未适配Symfony 6的方法签名要求。Symfony 6中Bundle::getContainerExtension()方法的返回类型声明为?ExtensionInterface,而旧版JMSBundle的对应方法缺少这个类型声明,导致兼容性问题。
解决办法是升级到JMSI18nRoutingBundle 3.x版本,该版本已适配Symfony 6。执行以下命令安装:
composer require jms/i18n-routing-bundle:^3.0
Symfony 6 官方路由国际化实现(无需第三方Bundle)
Symfony 6本身内置了路由国际化方案,完全可以不用依赖第三方Bundle,步骤如下:
1. 基础配置
首先在config/packages/translation.yaml中配置默认区域和支持的区域列表:
framework: default_locale: en translator: default_path: '%kernel.project_dir%/translations' fallbacks: ['en']
在.env文件中定义支持的区域(可选,方便后续复用):
APP_LOCALES=en|fr|es
2. 路由国际化的两种实现方式
方式一:统一前缀批量配置
如果希望所有控制器的路由都自动带上区域前缀,修改config/routes/annotations.yaml(或对应路由配置文件):
controllers: resource: '../../src/Controller/' type: annotation prefix: /{_locale} requirements: _locale: '%APP_LOCALES%' defaults: _locale: '%kernel.default_locale%'
这样所有控制器的路由都会自动添加/{_locale}前缀,无需逐个路由配置。
方式二:单个路由单独配置
如果只需要部分路由支持国际化,可以在路由注解或yaml中单独设置:
注解方式:
// src/Controller/HomeController.php use Symfony\Component\Routing\Annotation\Route; class HomeController { /** * @Route("/{_locale}/home", name="home", requirements={"_locale"="%APP_LOCALES%"}, defaults={"_locale"="%kernel.default_locale%"}) */ public function index() { // 业务逻辑 } }
YAML方式:
# config/routes.yaml home: path: /{_locale}/home controller: App\Controller\HomeController::index requirements: _locale: '%APP_LOCALES%' defaults: _locale: '%kernel.default_locale%'
是否需要在每个路由中设置{_locale}参数?
不需要。通过上述统一前缀配置可以批量为所有路由添加{_locale}参数;如果只需要部分路由支持国际化,再单独为这些路由配置即可。同时通过defaults设置默认区域,当URL中未指定_locale时,会自动使用默认值。
内容的提问来源于stack exchange,提问作者Varqas
相关产品推荐
相关产品推荐

