Symfony中的自定义i18n路由

Symfony中的自定义i18n路由,symfony,internationalization,routing,Symfony,Internationalization,Routing,我使用的是JMS\I18nRoutingBundle,Gedmo\translateable和Gedmo\Sluggable。具有默认位置的路由也可以工作,但其他区域设置在没有转换的slug的情况下也可以工作。我的i18n路由具有以下设置: #条令扩展 stof_原则的扩展: 默认语言环境:%locale% 翻译回退:正确 orm: 违约: #… 史拉盖博:是的 可译:对 可记录的:错误 #… jms_i18n_路由: 默认语言环境:cs\u CZ 地区:[cs\u CZ,en\u US] 策略

我使用的是
JMS\I18nRoutingBundle
Gedmo\translateable
Gedmo\Sluggable
。具有默认位置的路由也可以工作,但其他区域设置在没有转换的slug的情况下也可以工作。我的i18n路由具有以下设置:

#条令扩展
stof_原则的扩展:
默认语言环境:%locale%
翻译回退:正确
orm:
违约:
#…
史拉盖博:是的
可译:对
可记录的:错误
#…
jms_i18n_路由:
默认语言环境:cs\u CZ
地区:[cs\u CZ,en\u US]
策略:定制
主持人:
cs_CZ:example.CZ
en_US:example.com
将_重定向到_主机:true
当我这样设置路线时:

hw_类别:
模式:/category/{slug}
默认值:{u控制器:AcmeSiteBundle:Category:detail}
/**
*@模板
*/
公共功能详细信息操作(类别$Category)
{}
这条路线有效
捷克语示例.cz/category/slug

example.com/category/slug捷克语


但是我想得到英语的work
example.com/category/slug
,它抛出404异常
未找到对象

,因为我看到您正在使用ParamConverter自动获取类别

如果
slug(英文)
是数据库中现有的slug,但doctrine拒绝获取它

此时,您可能没有将可翻译侦听器添加到EntityManager中

示例

$translatableListener = new \Gedmo\Translatable\TranslationListener();
$translatableListener->setTranslatableLocale('en_us');
$em->addEventSubscriber($translatableListener);
stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            # ...
            translatable: true
如果您使用的是StofDoctrineExtensionsBundle

$translatableListener = new \Gedmo\Translatable\TranslationListener();
$translatableListener->setTranslatableLocale('en_us');
$em->addEventSubscriber($translatableListener);
stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            # ...
            translatable: true

在控制器中,必须重写实体存储库中使用的方法:

/**
 * @Template
 * @ParamConverter(
 *     "category",
 *     class = "AcmeSiteBundle:Category",
 *     options = {
 *         "repository_method" = "findByTranslatedSlug"
 *     }
 *  )
 */
public function detailAction(Category $category)
{}


我也遇到了同样的问题,正如jkucharovic所建议的那样,您可以使用参数转换器将请求参数转换为对象

为了从数据库中获取对象,原则转换器默认使用find()方法。但是,由于我们使用可翻译的表,因此需要多个表,管理翻译是不够的,这就是为什么我们需要定义自己的表。这里是findByTranslatedSlug

/**
 * @Template
 * @ParamConverter(
 *     "category",
 *     class = "AcmeSiteBundle:Category",
 *     options = {
 *         "id" = "slug",
 *         "repository_method" = "findByTranslatedSlug"
 *     }
 *  )
 */
public function detailAction(Category $category)
{}
有关ParamConverter参数的一些详细信息:

  • 第一个参数“category”是指方法参数的名称(这里是$category)
  • “id”选项是指要传递给自定义存储库方法(findByTranslatedSlug())的路由占位符(此处为{slug})。如果不设置此选项,它将引发PDO异常

我希望这能有所帮助

文件:


我应该将
可翻译侦听器附加到哪里
–在哪个文件中?您使用的是StofOctrineExtensionsBundle吗?是的,我使用的是StofOctrineExtensionBundle,我以前已经配置过。(我想你的意思是
可翻译的
–不
可翻译的
)扩展顺序重要吗?