【问题标题】:Make Doctrine use result cache by default使 Doctrine 默认使用结果缓存
【发布时间】:2011-05-04 16:25:38
【问题描述】:

我正在将 Memcache 绑定到 Doctrine,看来我必须在每个查询中明确地 useResultCache。是否可以默认设置为true,并且可以在不需要的地方设置useResultCache(false)?

【问题讨论】:

  • 你找到解决办法了吗?

标签: caching doctrine memcached


【解决方案1】:

创建一个明确设置useResultCache(true) 的包装类/函数,并在任何地方使用它而不是原生函数。

【讨论】:

  • 我试图避免修改每个查询。这个解决方案仍然需要它,对吧?
【解决方案2】:

我知道这个问题很老了,但我会写出我想到的最佳答案。

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

}

【讨论】:

  • @Jarrett 引用 EntityManager DocBlock:您永远不应尝试从 EntityManager 继承:继承不是 EntityManager 的有效扩展点。相反,您应该查看 {@see \Doctrine\ORM\Decorator\EntityManagerDecorator} 并将您的实体管理器包装在装饰器中。它仍然没有回答 为什么。
【解决方案3】:

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

这是一个有用的小技巧,可以为您节省大量打字,但要小心;我发现缓存驱动程序不会缓存尚未初始化的延迟加载关联(现在我想起来很明显)。有时为每个单独的查询打开结果缓存会更安全。

【讨论】:

  • 我意识到建议破解内核可能会为我赢得反对票,但OP's comment 建议他们不想重新编写每个查询。如果是这种情况,破解AbstractQuery 是最简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2017-01-04
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多