Doctrine查询缓存和事件侦听器

时间:2014-06-17 08:11:33

标签: symfony caching doctrine-orm

我有一个事件监听器,以便按用户进行过滤:

class UserFilter extends SQLFilter
{   
  public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
  {
    ...
    return $targetTableAlias.'.createdBy = ' .$this->security_context->getToken()->getUser()->getId(); 
  }             
}

它在开发环境中很好,但是除了第一次调用之外,没有在prod环境中调用过滤器

config_prod.yml中,我有:

doctrine:
  orm:
    metadata_cache_driver:
        type: memcache
        host: localhost
        port: 11211
        instance_class: Memcache
    query_cache_driver:
        type: memcache
        host: localhost
        port: 11211
        instance_class: Memcache

如果我发表评论query_cache_driver,我就没有这个问题...... 我认为query_cache禁用对过滤器监听器的调用,我该如何解决?

2 个答案:

答案 0 :(得分:0)

如果使用查询缓存,则会跳过整个sql查询构建过程。你应该做的不是使用过滤器,而是将用户id传递给你的函数,并将它作为参数绑定到查询。这里真正的问题是你没有将它用作参数,而是用作'string',并且该部分用查询缓存进行缓存。 如果你也可以在eventlistener中将参数绑定为参数,那么它也可以工作。

您可以尝试使用here

描述的内容

答案 1 :(得分:0)

此处addFilterConstraint必须返回字符串,但您可以设置一些参数以避免缓存问题。

也许解决方法是在过滤器内部设置一些随机参数来触发缓存。

$this->setParameter('cache', $random);