背景:我们正在使用Symfony 3.1 + Doctrine 2.5.5 + symfony doctrine bundle。
在尝试为我们的实体启用二级缓存时,我们遇到了以下问题。如果我们使用NONSTRICT_READ_WRITE,一切正常。但是,当我们尝试使用READ_WRITE时,我们收到以下错误 0)
Type error: Argument 2 passed to Doctrine\ORM\Cache\Persister\Entity\ReadWriteCachedEntityPersister::__construct() must be an instance of Doctrine\ORM\Cache\ConcurrentRegion, instance of Doctrine\ORM\Cache\Region\DefaultRegion given, called in vendor/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCacheFactory.php on line 133
据我所知,我们需要实际实现我们自己的ConcurrentRegion和CacheFactory版本才能使它工作(FileLockRegion不适合我们,因为它使用文件系统来处理缓存锁)。所以我编写了这些实现,但现在的主要问题在于:我找不到将自定义工厂类名称放在配置中的位置。我们在config中尝试了以下位置:
1)
doctrine:
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: master
second_level_cache:
default_cache_factory:
class: AppBundle\Cache\MyCacheFactory
由于
而失败Unrecognized option "second_level_cache" under "doctrine.orm"
即使在我们使用Symfony 2.8选项的其他项目中,“second_level_cache”也不会引发任何错误。
所以我们去了doctrine包代码并找到了以下节点描述(vendor / doctrine / doctrine-bundle / DependencyInjection / Configuration.php:492)
->arrayNode('second_level_cache')
->children()
->append($this->getOrmCacheDriverNode('region_cache_driver'))
->scalarNode('region_lock_lifetime')->defaultValue(60)->end()
->booleanNode('log_enabled')->defaultValue($this->debug)->end()
->scalarNode('region_lifetime')->defaultValue(0)->end()
->booleanNode('enabled')->defaultValue(true)->end()
->scalarNode('factory')->end()
->end()
所以我们决定在主实体管理器部分尝试这个配置: 2)
second_level_cache:
region_cache_driver:
type: memcache
enabled: true
log_enabled: true
factory: AppBundle\Cache\MyCacheFactory
regions:
hour_region:
lifetime: 3600
但是,即使此配置被认为有效,当我们实际尝试使用已配置的缓存访问实体时,我们会收到错误0),这使我们认为doctrine / symfony正在忽略此选项。
有什么办法可以通过.yml配置来完成吗? Doctrine docs只建议实现CacheFactory并提供一个PHP代码示例,但即使我们决定放弃将我们的类放在.yml配置中并以PHP方式运行,它仍然不清楚这个PHP代码应该去哪里
答案 0 :(得分:0)
使用类型-文件锁配置FilelockRegion
regions:
default:
cache_driver:
type: service
id: 'Doctrine\Common\Cache\RedisCache'
lifetime: 3600
type: filelock