我将Memcache绑定到Doctrine,似乎我必须在每个查询中明确地useResultCache
。是否可以默认设置true
,并且能够useResultCache(false)
不需要它?
答案 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)
轻松关闭单个查询的缓存
这是一个有用的小黑客,可以节省你很多打字,但要小心;我发现缓存驱动程序不会缓存尚未初始化的延迟加载的关联(现在我很清楚这一点)。有时,为每个单独的查询打开结果缓存更安全。