Symfony 2.3 Gedmo doctrine extensions translatable caching

前端 未结 1 690
囚心锁ツ
囚心锁ツ 2020-12-18 16:35

I\'m using Gedmo Doctrine extensions
All works well so far, except for translations caching.

$entity = $repository
            ->findByIdFullData($i         


        
相关标签:
1条回答
  • 2020-12-18 16:57

    Our working code:

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

    EDIT: And if you want to "getResult"

    Performing getResult changes hydration mode. Have look on AbstractQuery class method:

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

    It works with getOneOrNullResult because it didn't changes hydration mode

    public function getOneOrNullResult($hydrationMode = null)
    

    If you want to cache translatable queries you should change hydration mode during execution getResult method to TranslationWalker::HYDRATE_OBJECT_TRANSLATION.

    Personally I'll wrap this method into service which will handle everything associated with translations.

    0 讨论(0)
提交回复
热议问题