2014-10-09 6 views
1

Я пытаюсь получить объект, переведенной слизняк, например, так:Doctrine2 - ошибка при использовании @ParamConverter

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 - мое действие конфигурируется с @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 Я получаю ошибку доктрины:

Unable to guess how to get a Doctrine instance from the request information.

Я не могу найти то, что вызывает ошибку, возможно, метод хранилища и отображение не могут одновременно использоваться вместе. Вы можете помочь?

ответ

0

Я не могу проверить поведение напрямую, но я подозреваю, что проблема заключается в том, что вы точно указали, какие именно заполнители маршрутов сопоставляют параметры метода в вашей записи mapping, но не предоставляют все необходимые параметры (и также используют метод пользовательского репозитория). Symfony обычно угадывает, как использовать заполнители для поиска объекта, но не в ненормальных обстоятельствах.

EDIT: Просто подтвердил это в Symfony source - если mapping установлен, то Entity извлекается путем передачи всей информации отображения (в ассоциативном массиве) в $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" 
*  } 
* ) 
*/ 
+0

Спасибо, но отображение работает только с полями сущностей, и я хочу, чтобы пройти языковой стандарт для TranslatableListener. Есть идеи? –