Doctrine2 - 使用@ParamConverter时出错

时间:2014-10-09 08:42:14

标签: php symfony doctrine-orm

我尝试通过翻译的slug检索对象,如下所示:

1 - 我使用以下方法创建了一个自定义存储库:

public function findByTranslatedSlug($slug, $locale)
 {
   var_dump($_locale);exit;
   $qb = $this->createQueryBuilder('c')
       ->where('c.slug = :slug')
       ->setParameters($slug);
   $query = $qb->getQuery();

   $query->setHint(
      \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
      'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
      \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $locale
   );
   return $query->getOneOrNullResult();
}

2 - 我的Action配置了@ParamConverter,如下所示:

/**
* @Route("/{slug}", name="name")
* @Template()
* @ParamConverter(
*     "content",
*     class = "StenikContentBundle:Content",
*     options = {
*           "mapping" = {"_locale": "locale"},
*           "repository_method" = "findByTranslatedSlug"
*     }
*  )
*/
public function indexAction($content)
{
   var_dump($content->getSlug());exit;
}

3 - 主要路由

stenik_content:
    resource: "@StenikContentBundle/Controller/"
    type:     annotation
    prefix:   /{_locale}

尝试通过xxx.localhost/app_dev.php/en/some-slug检索对象后,我收到了一个学说错误:

  

无法猜测如何从请求中获取Doctrine实例   信息。

我无法找到导致错误的原因,也许存储库方法和映射无法一起使用。你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

我无法直接检查行为,但我怀疑问题是您已准确指定哪个路径占位符与mapping条目中的方法参数匹配,但未提供所有必需参数(并且还使用自定义存储库方法)。 Symfony通常能够猜测如何使用占位符来查找实体,但不是在异常情况下。

编辑:刚刚在Symfony source中确认了这一点 - 如果设置了mapping,则通过将所有映射信息(在关联数组中)传递到$repository->findOneBy方法来检索实体,或者repository_method中命名的方法。这意味着您选择的方法还需要将关联数组作为其参数,而不是两个单独的localeslug参数。

所以也许试试这个?:

/**
* @Route("/{slug}", name="name")
* @Template()
* @ParamConverter(
*     "content",
*     class = "StenikContentBundle:Content",
*     options = {
*           "mapping" = {"_locale": "locale", "slug": "slug"}, #include slug here
*           "repository_method" = "findByTranslatedSlug"
*     }
*  )
*/