Преглед изворни кода

[DoctrineBundle] Adding missing cache driver configuration for each entity manager.

Jonathan H. Wage пре 15 година
родитељ
комит
13663966d0

+ 41 - 20
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -274,9 +274,9 @@ class DoctrineExtension extends Extension
         $this->loadOrmCacheDrivers($entityManager, $container);
 
         $methods = array(
-            'setMetadataCacheImpl' => new Reference('doctrine.orm.metadata_cache'),
-            'setQueryCacheImpl' => new Reference('doctrine.orm.query_cache'),
-            'setResultCacheImpl' => new Reference('doctrine.orm.result_cache'),
+            'setMetadataCacheImpl' => new Reference(sprintf('doctrine.orm.%s_metadata_cache', $entityManager['name'])),
+            'setQueryCacheImpl' => new Reference(sprintf('doctrine.orm.%s_query_cache', $entityManager['name'])),
+            'setResultCacheImpl' => new Reference(sprintf('doctrine.orm.%s_result_cache', $entityManager['name'])),
             'setMetadataDriverImpl' => new Reference('doctrine.orm.metadata_driver'),
             'setProxyDir' => $proxyCacheDir,
             'setProxyNamespace' => $container->getParameter('doctrine.orm.proxy_namespace'),
@@ -392,23 +392,9 @@ class DoctrineExtension extends Extension
      */
     protected function loadOrmEntityManagerMetadataCacheDriver(array $entityManager, ContainerBuilder $container)
     {
-        $metadataCacheDriver = $container->getParameter('doctrine.orm.metadata_cache_driver');
-        $emMetadataCacheDriver = isset($entityManager['metadata_cache_driver']) ? $entityManager['metadata_cache_driver'] : $metadataCacheDriver;
-        $type = is_array($emMetadataCacheDriver) && isset($emMetadataCacheDriver['type']) ? $emMetadataCacheDriver['type'] : $emMetadataCacheDriver;
-
-        if ($type === 'memcache') {
-            $memcacheClass = isset($emMetadataCacheDriver['class']) ? $emMetadataCacheDriver['class'] : '%'.sprintf('doctrine.orm.cache.%s_class', $type).'%';
-            $cacheDef = new Definition($memcacheClass);
-            $memcacheHost = isset($emMetadataCacheDriver['host']) ? $emMetadataCacheDriver['host'] : '%doctrine.orm.cache.memcache_host%';
-            $memcachePort = isset($emMetadataCacheDriver['port']) ? $emMetadataCacheDriver['port'] : '%doctrine.orm.cache.memcache_port%';
-            $memcacheInstanceClass = isset($emMetadataCacheDriver['instance_class']) ? $emMetadataCacheDriver['instance_class'] : '%doctrine.orm.cache.memcache_instance_class%';
-            $memcacheInstance = new Definition($memcacheInstanceClass);
-            $memcacheInstance->addMethodCall('connect', array($memcacheHost, $memcachePort));
-            $container->setDefinition(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']), $memcacheInstance);
-            $cacheDef->addMethodCall('setMemcache', array(new Reference(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']))));
-        } else {
-            $cacheDef = new Definition('%'.sprintf('doctrine.orm.cache.%s_class', $type).'%');
-        }
+        $cacheDriver = $container->getParameter('doctrine.orm.metadata_cache_driver');
+        $cacheDriver = isset($entityManager['metadata_cache_driver']) ? $entityManager['metadata_cache_driver'] : $cacheDriver;
+        $cacheDef = $this->getEntityManagerCacheDefinition($entityManager, $cacheDriver, $container);
         $container->setDefinition(sprintf('doctrine.orm.%s_metadata_cache', $entityManager['name']), $cacheDef);
     }
 
@@ -420,6 +406,10 @@ class DoctrineExtension extends Extension
      */
     protected function loadOrmEntityManagerQueryCacheDriver(array $entityManager, ContainerBuilder $container)
     {
+        $cacheDriver = $container->getParameter('doctrine.orm.query_cache_driver');
+        $cacheDriver = isset($entityManager['query_cache_driver']) ? $entityManager['query_cache_driver'] : $cacheDriver;
+        $cacheDef = $this->getEntityManagerCacheDefinition($entityManager, $cacheDriver, $container);
+        $container->setDefinition(sprintf('doctrine.orm.%s_query_cache', $entityManager['name']), $cacheDef);
     }
 
     /**
@@ -430,6 +420,37 @@ class DoctrineExtension extends Extension
      */
     protected function loadOrmEntityManagerResultCacheDriver(array $entityManager, ContainerBuilder $container)
     {
+        $cacheDriver = $container->getParameter('doctrine.orm.result_cache_driver');
+        $cacheDriver = isset($entityManager['result_cache_driver']) ? $entityManager['result_cache_driver'] : $cacheDriver;
+        $cacheDef = $this->getEntityManagerCacheDefinition($entityManager, $cacheDriver, $container);
+        $container->setDefinition(sprintf('doctrine.orm.%s_result_cache', $entityManager['name']), $cacheDef);
+    }
+
+    /**
+     * Gets an entity manager cache driver definition for metadata, query and result caches.
+     *
+     * @param array $entityManager
+     * @param string $cacheDriver
+     * @param ContainerBuilder $container
+     * @return Definition $cacheDef
+     */
+    protected function getEntityManagerCacheDefinition(array $entityManager, $cacheDriver, ContainerBuilder $container)
+    {
+        $type = is_array($cacheDriver) && isset($cacheDriver['type']) ? $cacheDriver['type'] : $cacheDriver;
+        if ($type === 'memcache') {
+            $memcacheClass = isset($cacheDriver['class']) ? $cacheDriver['class'] : '%'.sprintf('doctrine.orm.cache.%s_class', $type).'%';
+            $cacheDef = new Definition($memcacheClass);
+            $memcacheHost = isset($cacheDriver['host']) ? $cacheDriver['host'] : '%doctrine.orm.cache.memcache_host%';
+            $memcachePort = isset($cacheDriver['port']) ? $cacheDriver['port'] : '%doctrine.orm.cache.memcache_port%';
+            $memcacheInstanceClass = isset($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%doctrine.orm.cache.memcache_instance_class%';
+            $memcacheInstance = new Definition($memcacheInstanceClass);
+            $memcacheInstance->addMethodCall('connect', array($memcacheHost, $memcachePort));
+            $container->setDefinition(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']), $memcacheInstance);
+            $cacheDef->addMethodCall('setMemcache', array(new Reference(sprintf('doctrine.orm.%s_memcache_instance', $entityManager['name']))));
+        } else {
+            $cacheDef = new Definition('%'.sprintf('doctrine.orm.cache.%s_class', $type).'%');
+        }
+        return $cacheDef;
     }
 
     /**

+ 25 - 0
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php

@@ -149,6 +149,22 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
         $this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
         $this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
+
+        $definition = $container->getDefinition('doctrine.orm.default_configuration');
+        $calls = $definition->getMethodCalls();
+        $this->assertEquals(array('YamlBundle' => 'Fixtures\Bundles\YamlBundle\Entity'), $calls[0][1][0]);
+        $this->assertEquals('doctrine.orm.default_metadata_cache', (string) $calls[1][1][0]);
+        $this->assertEquals('doctrine.orm.default_query_cache', (string) $calls[2][1][0]);
+        $this->assertEquals('doctrine.orm.default_result_cache', (string) $calls[3][1][0]);
+
+        $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
+        $this->assertEquals('%doctrine.orm.cache.array_class%', $definition->getClass());
+
+        $definition = $container->getDefinition('doctrine.orm.default_query_cache');
+        $this->assertEquals('%doctrine.orm.cache.array_class%', $definition->getClass());
+
+        $definition = $container->getDefinition('doctrine.orm.default_result_cache');
+        $this->assertEquals('%doctrine.orm.cache.array_class%', $definition->getClass());
     }
 
     public function testSingleEntityManagerConfiguration()
@@ -289,6 +305,15 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('doctrine.dbal.conn2_connection', (string) $arguments[0]);
         $this->assertInstanceOf('Symfony\Components\DependencyInjection\Reference', $arguments[1]);
         $this->assertEquals('doctrine.orm.dm2_configuration', (string) $arguments[1]);
+
+        $definition = $container->getDefinition('doctrine.orm.dm1_metadata_cache');
+        $this->assertEquals('%doctrine.orm.cache.xcache_class%', $definition->getClass());
+
+        $definition = $container->getDefinition('doctrine.orm.dm1_query_cache');
+        $this->assertEquals('%doctrine.orm.cache.array_class%', $definition->getClass());
+
+        $definition = $container->getDefinition('doctrine.orm.dm1_result_cache');
+        $this->assertEquals('%doctrine.orm.cache.array_class%', $definition->getClass());
     }
 
     public function testBundleEntityAliases()