Заставить Doctrine использовать кеш результатов по умолчанию - PullRequest
3 голосов
/ 04 мая 2011

Я связываю Memcache с Doctrine, и, похоже, мне нужно useResultCache явно в каждом запросе. Можно ли сделать его по умолчанию true с возможностью useResultCache(false) там, где это не нужно?

Ответы [ 3 ]

8 голосов
/ 04 мая 2011

Создайте класс / функцию-оболочку, которая явно устанавливает useResultCache(true), и используйте ее везде вместо встроенной функции.

3 голосов
/ 05 мая 2014

Я знаю, что этот вопрос старый, но я напишу лучший ответ, который приходит мне в голову.

1) Абстрагируйте вашу зависимость от интерфейса (т. Е. Используйте шаблон внедрения зависимостей, чтобы внедрить EntityManager вваш класс, который создает запросы и использует вместо этого EntityManagerInterface)

Теперь либо:

a) [Лучше, но дольше] Создайте новую реализацию, связанную с композицией для EntityManagerInterface, которая будет вызывать прокси-вызовы оригиналаentityManager и установит флаг кэша результатов в true:

<?php
class CachedEntityManager implements EntityManagerInterface { 

private $proxiedManager;

public function __construct(EntityManagerInterface $proxiedManager) {   
    $this->proxiedManager = $proxiedManager;    
}

public function createQuery($dql = '') {
    $query = $this->proxiedManager->createQuery($dql);
    $query->useResultCache(true);   
}

[... proxy all the calls forth to proxiedManager ...]

}

b) [Не так хорошо, но короче] Расширьте класс EntityManager и переопределите createQuery.Помните, что в общем случае это не очень хорошая практика, и вам определенно не следует больше ничего писать в этом классе, а вместо этого преобразовать в a):

<?php
class CachedEntityManager extends EntityManager { 

public function createQuery($dql = '') {
    $query = parent::createQuery($dql);
    $query->useResultCache(true);   
}

}
2 голосов
/ 05 сентября 2011

Вы можете немного взломать ядро ​​Doctrine, установив значение по умолчанию $_useResultCache в TRUE в \Doctrine\ORM\AbstractQuery.Это заставит все запросы использовать resultCacheDriver по умолчанию, и вы можете легко отключить кеш для отдельных запросов, используя $query->useResultCache(FALSE)

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

...