默认情况下,使Doctrine使用结果缓存

时间:2011-05-04 16:25:38

标签: caching doctrine memcached

我将Memcache绑定到Doctrine,似乎我必须在每个查询中明确地useResultCache。是否可以默认设置true,并且能够useResultCache(false)不需要它?

3 个答案:

答案 0 :(得分:8)

创建一个显式设置useResultCache(true)的包装器类/函数,并在任何地方使用它而不是本机函数。

答案 1 :(得分:3)

我知道这个问题已经过时了,但我会写下我脑海中最好的答案。

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 :(得分:2)

您可以通过在$_useResultCache中将TRUE的默认值设置为\Doctrine\ORM\AbstractQuery来稍微破解Doctrine核心。这将使所有查询默认使用resultCacheDriver,您可以使用$query->useResultCache(FALSE)轻松关闭单个查询的缓存

这是一个有用的小黑客,可以节省你很多打字,但要小心;我发现缓存驱动程序不会缓存尚未初始化的延迟加载的关联(现在我很清楚这一点)。有时,为每个单独的查询打开结果缓存更安全。