使用相关实体信息的Doctrine ParamConverter



我在Symfony中有一个Post实体。该项目有翻译,存储在PostTranslation中。

每一篇文章都有一段不同语言的片段。

代码看起来像:

use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
/**
* @I18nDoctrine
* @Route("/blog/{slug}")
* @ParamConverter("post", class="SensioBlogBundle:Post")
*/
public function showAction(Post $post)
{
}

但是我怎样才能进行findOneBy('slug')类型的搜索呢?因为它存储在相关实体中。

我想除了slug属性之外,您的PostTranslation实体还存储某种语言/区域设置,例如locale属性,对吗?我还猜测你的网站是基于URL中存储的一些参数(不同(子域)、查询字符串参数、路径前缀——这无关紧要)进行对话的,对吧?

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

  1. 放弃使用ParamConverter,一切由自己完成
  2. 从SensionFrameworkExtraBundle重写DoctrineParamConverter,并为Post类添加对sluglocale查找的支持。我还建议创建一个更健壮的解决方案:

    1. 创建定义getTranslations()setTranslations()方法的Translatable接口,并将其应用于Post
    2. 在您的CustomDoctrineParamConverter中,检查请求的类是否实现了此接口,如果是,则意味着您将根据实体的翻译来搜索实体,即locale和一些区域设置唯一属性
    3. 现在,您需要一些方法来获得此区域设置唯一属性的名称。您可以为PostTranslation类创建另一个接口,它将定义一个方法,类似于getLocaleIdentifier/UniqueProperty,对于PostTranslation,它将返回"slug"
    4. 如果你知道,你需要找到一个Post属性,基于localeslug属性的translations关联,你可以很容易地创建DQL查询来做到这一点
  3. ParamConverter注释具有repository_method属性,该属性允许您使用PostRepository中的自定义方法,该方法应检索Post实体。唯一的问题是内置的DoctrineParamConverter将只向该方法传递slug参数。您的存储库必须以某种方式了解当前的区域设置。这可以通过多种不同的方式实现,以下是其中之一:

    1. 使用单个方法setLocale($locale)创建LocaleAware接口
    2. PostRepository中实现该接口
    3. 创建侦听kernel.request事件的事件侦听器:

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

相关内容

  • 没有找到相关文章

最新更新