1

在较新版本的 Doctrine2 中,我知道有Doctrine\ORM\Configuration#setHydrationCacheImpl() MemcacheCache 等要通过。

但是如何在容器中完成呢?

我正在使用两个 entity_manager:名为“default”和“other”。

我首先尝试将 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由我定义,instanceofDoctrine\Common\Cache\MemcacheCache

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

我还尝试直接在 AppKernel#buildContainer 中调整容器,但没有将 \Doctrine\ORM\Configuration 实例定义为服务,因此我无法检索 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?

4

2 回答 2

1

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

...
$query = $queryBuilder->getQuery();
$cache = $this->container->get('...'); //instanceof MemcacheCache
$query->setHydrationCacheProfile(new CacheProfile(null, null $cache));
$query->execute();
...
于 2013-06-03T09:32:17.817 回答
0

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

从 Doctrine 2.1 开始,Doctrine 可以缓存查询的结果,但它不会缓存 hydration 后的对象。

查看有关教义配置的文档:

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

于 2013-05-31T10:57:35.930 回答