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
Но переводы не кешируются. В профилировщике я вижу такие запросы:

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

И все запросы в профилировщике должны получить результаты от ext_translations, Как я могу кешировать результат уже с переведенными строками?

Пробовал использовать Array Hydration и memCache, но больше не мешал, потому что мой результат был загружен медиа-файл, который не может быть сериализован или что-то еще. В любом случае, я бы переписал большую часть кода.

Любая помощь приветствуется.


редактировать:

Я попробовал ответ Кароля Войцеховского, и он решил часть проблемы. Кеширует когда пользуюсь 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) (обратите внимание, параметр limit), он все еще не кешируется, но потом, если я изменю на getOneOrNullResult()запрос кэшируется

1

Решение

Наш рабочий код:

    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:

/**
* 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);
}

Работает с getOneOrNullResult потому что это не меняет режим гидратации

public function getOneOrNullResult($hydrationMode = null)

Если вы хотите кэшировать переводимые запросы, вы должны изменить режим гидратации во время выполнения метода getResult на TranslationWalker::HYDRATE_OBJECT_TRANSLATION,

Лично я перенесу этот метод в сервис, который будет обрабатывать все, что связано с переводами.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]