2014-11-27 3 views
1

사용 중 Gedmo Doctrine extensions
번역 캐싱을 제외한 모든 기능이 잘 작동합니다.Symfony 2.3 Gedmo 교리 확장 캐싱 수행

$entity = $repository 
      ->findByIdFullData($id) 
      ->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker') 
      ->useResultCache(true, $cache_time, $cache_name) 
      ->getOneOrNullResult(); 

findByIdFullData() 반환 \Doctrine\ORM\Query
그러나 번역은 캐시되지 않습니다. ext_translations에서 결과를 얻을 수 있습니다

SELECT 
    e0_.content AS content0, 
    e0_.field AS field1 
FROM 
    ext_translations e0_ 
WHERE 
    e0_.foreign_key = ? 
    AND e0_.locale = ? 
    AND e0_.object_class = ? 

그리고 프로파일에서 모든 쿼리 : 프로파일 러에서 나는 같은 쿼리를 참조하십시오. 이미 변환 된 문자열로 결과를 캐시 할 수 있습니까?

Array Hydration과 memCache를 사용해 보았지만 결과 항목에 일련 번호가 부여되지 않은 미디어 파일이 업로드 되었기 때문에 더 이상 엉망이되었습니다. 어쨌든 대부분의 코드를 다시 작성하게 될 것입니다.

도움을 주시면 감사하겠습니다.


편집는 :

나는 카롤 Wojciechowski 씨의 답변을 시도하고 그것은 문제의 일부를 해결했다. getOneOrNullResult()을 사용할 때 캐시하지만 getResult()은 캐시하지 않습니다. 여기에 몇 가지 코드가 있습니다. 서비스에서

:

$query = $this->em 
    ->getRepository('MainBundle:Channels') 
    ->findActiveChannelsByGroupId($id); 
$this->container->get('my.translations')->addTranslationWalkerToQuery($query, $this->request); 

$channels = $query 
    ->useResultCache(true, 900, '1__channels__active_by_group_1') 
    ->getResult(); 

채널 저장소 :

public function findActiveChannelsByGroupId($group_id, $limit = null) 
{ 
    $rs = $this 
     ->createQueryBuilder('c') 
     ->select('c', 'm') 
     ->leftJoin('c.media', 'm') 
     ->leftJoin('c.group', 'g') 
     ->where('c.active = 1') 
     ->andWhere('g.id = :group_id') 
     ->orderBy('c.sortOrder', 'asc') 
     ->setParameter('group_id', $group_id) 
     ->setMaxResults($limit); 

    return $rs->getQuery(); 
} 

내가 findActiveChannelsByGroupId($id, 1) (통지 제한 PARAM)로 변경하는 경우, 그것은 여전히 ​​캐시하지 않습니다,하지만 나는 getOneOrNullResult()로 변경하는 경우 , 쿼리가 캐시 됨

답변

3

우리 작업 코드 :

public function addTranslationWalkerToQuery($query, $request) 
{ 
    $config = $this->container->get('doctrine')->getManager()->getConfiguration(); 
    if ($config->getCustomHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION) === null) { 
     $config->addCustomHydrationMode(
      TranslationWalker::HYDRATE_OBJECT_TRANSLATION, 
      'Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator' 
     ); 
    } 

    $query->setHint(
     \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 
     'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker' 
    ); 
    $query->setHint(
     \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, 
     $request->getLocale() // take locale from session or request etc. 
    ); 
    $query->setHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION); 
    $query->setHint(Query::HINT_REFRESH, true); 
} 

편집 : 그리고 당신은 "getResult를"원하는 경우

getResult를 수화 모드를 변경 수행. AbstractQuery 클래스 메소드에 보라 :

가 변경 수화 모드를하지 않았기 때문에 그것은 getOneOrNullResult 작동
/** 
    * Gets the list of results for the query. 
    * 
    * Alias for execute(null, $hydrationMode = HYDRATE_OBJECT). 
    * 
    * @param int $hydrationMode 
    * 
    * @return array 
    */ 
    public function getResult($hydrationMode = self::HYDRATE_OBJECT) 
    { 
     return $this->execute(null, $hydrationMode); 
    } 

당신은 당신이 실행 getResult를 방법 중에 수화 모드를 변경해야합니다 번역 쿼리를 캐시하려면

public function getOneOrNullResult($hydrationMode = null) 

TranslationWalker::HYDRATE_OBJECT_TRANSLATION.

개인적으로 나는 번역과 관련된 모든 것을 처리 할 서비스로이 방법을 포장 할 것입니다.

+0

모든 컨트롤러에이 메소드를 추가해야하고 필요할 때마다 Query와 Request를 전달하여 호출해야하며'getResult()'만 호출하면됩니까? 죄송합니다. 어리 석습니다. Symfony에 대해별로 좋지 않습니다. – CRONUS

+0

번역이 포함 된 엔티티를 가져 오는 데 사용되는 서비스가 있습니다 (이 방법 포함). 예, 앱의 여러 위치에서 사용합니다. –

+0

그래서 일부 장소를 캐시에 넣으려고했는데 문제가 발생했습니다. getOneOrNullResult()를 사용하면 캐시 된 결과를 얻지 만,'getResult()'를 사용하면 질문에 설명 된 것과 같은 문제가 발생합니다. – CRONUS

관련 문제