我尝试通过翻译的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实例 信息。
我无法找到导致错误的原因,也许存储库方法和映射无法一起使用。你能帮忙吗?
答案 0 :(得分:0)
我无法直接检查行为,但我怀疑问题是您已准确指定哪个路径占位符与mapping
条目中的方法参数匹配,但未提供所有必需参数(并且还使用自定义存储库方法)。 Symfony通常能够猜测如何使用占位符来查找实体,但不是在异常情况下。
编辑:刚刚在Symfony source中确认了这一点 - 如果设置了mapping
,则通过将所有映射信息(在关联数组中)传递到$repository->findOneBy
方法来检索实体,或者repository_method
中命名的方法。这意味着您选择的方法还需要将关联数组作为其参数,而不是两个单独的locale
和slug
参数。
所以也许试试这个?:
/**
* @Route("/{slug}", name="name")
* @Template()
* @ParamConverter(
* "content",
* class = "StenikContentBundle:Content",
* options = {
* "mapping" = {"_locale": "locale", "slug": "slug"}, #include slug here
* "repository_method" = "findByTranslatedSlug"
* }
* )
*/