【发布时间】:2011-05-04 16:25:38
【问题描述】:
我正在将 Memcache 绑定到 Doctrine,看来我必须在每个查询中明确地 useResultCache。是否可以默认设置为true,并且可以在不需要的地方设置useResultCache(false)?
【问题讨论】:
-
你找到解决办法了吗?
标签: caching doctrine memcached
我正在将 Memcache 绑定到 Doctrine,看来我必须在每个查询中明确地 useResultCache。是否可以默认设置为true,并且可以在不需要的地方设置useResultCache(false)?
【问题讨论】:
标签: caching doctrine memcached
创建一个明确设置useResultCache(true) 的包装类/函数,并在任何地方使用它而不是原生函数。
【讨论】:
我知道这个问题很老了,但我会写出我想到的最佳答案。
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);
}
}
【讨论】:
您可以通过在\Doctrine\ORM\AbstractQuery 中将$_useResultCache 的默认值设置为TRUE 来稍微破解Doctrine 核心。这将使所有查询默认使用 resultCacheDriver,您可以使用 $query->useResultCache(FALSE) 轻松关闭单个查询的缓存
这是一个有用的小技巧,可以为您节省大量打字,但要小心;我发现缓存驱动程序不会缓存尚未初始化的延迟加载关联(现在我想起来很明显)。有时为每个单独的查询打开结果缓存会更安全。
【讨论】:
AbstractQuery 是最简单的解决方案。