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