如何让Symfony2 DIC调用Doctrine \ ORM \ Configuration#setHydrationCacheImpl()

时间:2013-05-31 09:31:46

标签: caching symfony doctrine-orm

截至Doctrine2的新版本,我知道有Doctrine\ORM\Configuration#setHydrationCacheImpl() 传递诸如MemcacheCache等

但如何在容器中完成?

我使用了两个entity_manager:named"默认"和"其他"。

我首先尝试将hydration_cache定义为config.yml,如

doctrine:
    orm:
        default_entity_manager: default
        ...
        entity_managers:
            default:
                ...
                metadata_cache_driver:
                    type: service
                    id: memcache_driver
                ...
                hydration_cache_driver:
                    type: service
                    id: memcache_driver
                ...
            other:
                ...

注意:memcache_driver由我定义,instanceof Doctrine\Common\Cache\MemcacheCache

然后我得到了Unrecognized options "hydration_cache_driver" under "doctrine.orm.entity_managers.default"

我还尝试在AppKernel#buildContainer中直接调整容器, 但是没有将\ Doctrine \ ORM \ Configuration定义为服务的实例, 所以我无法检索配置实例。

欢迎任何建议。

编辑:

我确信从Doctrine 2.2.2开始重新实现了缓存水合物的功能。

http://www.doctrine-project.org/jira/browse/DDC-1766

https://github.com/doctrine/doctrine2/blob/2.2.2/tests/Doctrine/Tests/ORM/Functional/HydrationCacheTest.php?source=c

对于其他简单服务,我可以通过覆盖整个定义(如

)轻松添加调用方法
service1:
    ...
    calls:
        [method calls]

但是对于entity_manager,我不确定如何向它们添加方法调用。

所以我的问题换句话说,如何在不使用语义配置的情况下在较低级别配置orm?

2 个答案:

答案 0 :(得分:1)

就我而言,由于几乎不使用水合缓存, 所以我决定在执行每个查询之前调用Query#setHydrationCacheProfile。

...
$query = $queryBuilder->getQuery();
$cache = $this->container->get('...'); //instanceof MemcacheCache
$query->setHydrationCacheProfile(new CacheProfile(null, null $cache));
$query->execute();
...

答案 1 :(得分:0)

没有这样的选项“hydration_cache_driver”,你应该使用“result_cache_driver”来实现这一点。

从Doctrine 2.1开始,Doctrine可以缓存查询结果,但是在水化后它不会缓存对象。

查看有关学说配置的文档:

http://symfony.com/doc/master/reference/configuration/doctrine.html