Doctrine ParamConverter使用相关实体的信息

时间:2014-01-09 18:33:42

标签: php symfony doctrine-orm

我在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')种搜索?因为它存储在相关的实体中。

1 个答案:

答案 0 :(得分:0)

我猜除了slug属性之外,您的PostTranslation实体存储某种语言/区域设置,例如locale财产,对吗?我还猜你的网站是基于存储在URL中的一些参数进行本地化的(不同的(子)域,查询字符串参数,路径前缀 - 它是不相关的),对吗?

至少有三种解决方案可以解决您的问题:

  1. 放弃使用ParamConverter并自行完成所有事情。
  2. DoctrineParamConverter覆盖SensionFrameworkExtraBundle并添加sluglocalePost查找的支持。我还建议创建一个更强大的解决方案:

    1. 创建定义TranslatablegetTranslations()方法的setTranslations()界面,并将其应用于Post课程。
    2. CustomDoctrineParamConverter检查请求的类是否实现此接口,如果是,则表示您将根据其转换搜索实体,即locale和某些区域设置唯一属性。
    3. 现在您需要一些方法来获取此区域设置唯一属性的名称。您可以为PostTranslation类创建另一个界面,该界面将定义单个方法,例如getLocaleIdentifier/UniquePropertyPostTranslation将返回"slug"
    4. 如果您知道,您需要根据其Post关联中的localeslug属性找到translations属性,您可以非常轻松地创建DQL查询那样做。
  3. ParamConverter注释具有repository_method属性,允许您使用PostRepository中应该检索Post实体的自定义方法。唯一的问题是内置DoctrineParamConverter只会将slug参数传递给此方法。您的存储库必须以某种方式通知当前的区域设置。这可以通过许多不同的方式实现,这是其中之一:

    1. 使用单个方法LocaleAware创建setLocale($locale)界面。
    2. PostRepository
    3. 中实施该界面 侦听kernel.request事件的
    4. Create event listener

      1. 遍历所有Doctrine的存储库。
      2. 检查给定的存储库是否实现了LocaleAware接口。
      3. 将请求的_locale属性注入存储库。