Symfony中FOSJsRouting生成带Locale前缀路由的问题求助
问题排查与解决办法
1. 校验JMS国际化路由配置
打开config/packages/jms_i18n_routing.yaml,确认custom策略的配置没有强制给路由名添加locale前缀:
jms_i18n_routing: default_locale: en locales: [en, tr] strategy: custom # 确保以下配置未开启(开启会自动给非默认locale的路由加前缀) # prefix_except_default: true
如果你的custom策略是通过自定义加载器实现的,检查加载器代码,确保没有在路由名前拼接{locale}__RG__这类标识。
2. 配置FOS JS路由与JMS兼容
修改config/packages/fos_js_routing.yaml,添加JMS路由的序列化策略,保证dump时能识别并输出不带locale前缀的路由名:
fos_js_routing: routes_to_expose: ['*'] # 按需指定要暴露的路由,用*表示全部 serializer: jms_i18n_routing.serializer.route_exclusion_strategy
3. 修正路由定义
- 对于不需要国际化的路由,不要使用
@I18nRoute注解,直接用原生Symfony的@Route:
/** * @Route("/search", name="search") */ public function search() { // ... }
- 如果需要国际化但不想路由名带前缀,在
@I18nRoute中设置name_prefix: '':
/** * @I18nRoute("/search", name="search", name_prefix="") */ public function search() { // ... }
4. 清理缓存并重新生成JS路由
先清理Symfony缓存:
php bin/console cache:clear --env=dev php bin/console cache:clear --env=prod
然后重新dump FOS路由文件:
php bin/console fos:js-routing:dump --target=public/static/js/fos_routing.js
5. 前端调用注意事项
如果上述配置生效,前端直接调用原路由名即可:
fos.Router.generate('search');
如果仍有问题,可在调用时显式指定locale参数:
fos.Router.generate('search', {}, { locale: 'en' });
内容的提问来源于stack exchange,提问作者Eray Can
相关产品推荐
相关产品推荐

