Symfony 4.4配置RedisTagAwareAdapter作为应用缓存报错如何解决
问题原因
报错是因为自定义的cache.adapter.redis_tag_aware服务配置冲突:当服务被打上cache.pool标签且指定了provider属性时,Symfony的缓存编译通道会自动将provider对应的连接作为第一个构造参数注入,和你显式声明的$redisClient参数重复冲突,就会触发参数不存在的报错。
解决方案
方式1:保留现有自定义连接,删除多余配置
直接去掉cache.adapter.redis_tag_aware服务tags配置里的provider: cache.default_redis_provider即可,修正后的服务配置如下:
redis.cache_app: class: Redis factory: ['Symfony\Component\Cache\Adapter\RedisAdapter', 'createConnection'] arguments: - '%env(REDIS_DNS)%' cache.adapter.redis_tag_aware: class: Symfony\Component\Cache\Adapter\RedisTagAwareAdapter arguments: $redisClient: '@redis.cache_app' $marshaller: '@?cache.default_marshaller' calls: - ['setLogger', ['@?logger']] tags: - { name: cache.pool, clearer: cache.default_clearer, reset: reset } - { name: monolog.logger, channel: cache }
方式2:复用系统默认Redis连接(简化配置)
如果不需要单独自定义Redis连接参数,可以直接复用系统自带的cache.default_redis_provider,不需要单独声明redis.cache_app服务:
cache.adapter.redis_tag_aware: class: Symfony\Component\Cache\Adapter\RedisTagAwareAdapter arguments: $redisClient: '@cache.default_redis_provider' $marshaller: '@?cache.default_marshaller' calls: - ['setLogger', ['@?logger']] tags: - { name: cache.pool, clearer: cache.default_clearer, reset: reset } - { name: monolog.logger, channel: cache }
常见疑问解答
- 是否可以直接用作App全局缓存?
完全可以,不需要单独创建自定义缓存池。修正配置后,你在framework.cache.app指定的适配器会全局生效,直接注入Symfony\Contracts\Cache\CacheInterface即可使用带标签能力的Redis缓存,兼容Symfony 4.4 LTS等低于5.2的版本。
内容的提问来源于stack exchange,提问作者P.K.
相关产品推荐
相关产品推荐

