我在Symfony中有Post
的实体。该项目有翻译,存储在PostTranslation
。
每个帖子都有一个针对每种语言不同的slug。
代码看起来像:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @I18nDoctrine
* @Route("/blog/{slug}")
* @ParamConverter("post", class="SensioBlogBundle:Post")
*/
public function showAction(Post $post)
{
}
但我怎样才能进行findOneBy('slug')
种搜索?因为它存储在相关的实体中。
答案 0 :(得分:0)
我猜除了slug
属性之外,您的PostTranslation
实体存储某种语言/区域设置,例如locale
财产,对吗?我还猜你的网站是基于存储在URL中的一些参数进行本地化的(不同的(子)域,查询字符串参数,路径前缀 - 它是不相关的),对吗?
至少有三种解决方案可以解决您的问题:
ParamConverter
并自行完成所有事情。从DoctrineParamConverter
覆盖SensionFrameworkExtraBundle并添加slug
和locale
类Post
查找的支持。我还建议创建一个更强大的解决方案:
Translatable
和getTranslations()
方法的setTranslations()
界面,并将其应用于Post
课程。CustomDoctrineParamConverter
检查请求的类是否实现此接口,如果是,则表示您将根据其转换搜索实体,即locale
和某些区域设置唯一属性。 PostTranslation
类创建另一个界面,该界面将定义单个方法,例如getLocaleIdentifier/UniqueProperty
,PostTranslation
将返回"slug"
。Post
关联中的locale
和slug
属性找到translations
属性,您可以非常轻松地创建DQL查询那样做。 ParamConverter
注释具有repository_method
属性,允许您使用PostRepository
中应该检索Post
实体的自定义方法。唯一的问题是内置DoctrineParamConverter
只会将slug
参数传递给此方法。您的存储库必须以某种方式通知当前的区域设置。这可以通过许多不同的方式实现,这是其中之一:
LocaleAware
创建setLocale($locale)
界面。PostRepository
kernel.request
事件的LocaleAware
接口。_locale
属性注入存储库。