Кэш запросов Doctrine и прослушиватель событий

#symfony #caching #doctrine-orm

#symfony #кэширование #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 , отключить вызов прослушивателя фильтров, как я могу это решить?

Ответ №1:

Если вы используете кэш запросов, весь процесс построения sql-запросов пропускается. Что вам следует сделать, так это не использовать filter, а передать идентификатор пользователя вашей функции и привязать его к запросу в качестве параметра. Реальная проблема здесь в том, что вы использовали его не как параметр, а как «строку», и эта часть кэшируется с помощью кэширования запросов. Если вы также можете привязать параметр к eventlistener в качестве параметра, то это также может работать.

Возможно, вы можете попробовать то, что описано здесь

Комментарии:

1. я использую sqlfilter, чтобы не передавать идентификатор пользователя для всех функций (многие объекты, многие функции, …), и я не уверен, что вы можете связать параметр с sqlfilter (addFilterConstraint должен возвращать строку)

Ответ №2:

Здесь addFilterConstraint должна возвращаться строка, но вы можете установить некоторые параметры, чтобы избежать проблемы с кэшированием.

Возможно, решение состоит в том, чтобы установить некоторый случайный параметр внутри filter только для запуска кэша.

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