فهرست منبع

allow addition configuration in other config files, without killing the mapping that was previously set

IamPersistent 14 سال پیش
والد
کامیت
8d69f8efd5
1فایلهای تغییر یافته به همراه23 افزوده شده و 5 حذف شده
  1. 23 5
      src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

+ 23 - 5
src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

@@ -135,9 +135,14 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
         $defaultDatabase = isset($documentManager['default_database']) ? $documentManager['default_database'] : $container->getParameter('doctrine.odm.mongodb.default_database');
         $proxyCacheDir = $container->getParameter('kernel.cache_dir').'/doctrine/odm/mongodb/Proxies';
         $hydratorCacheDir = $container->getParameter('kernel.cache_dir').'/doctrine/odm/mongodb/Hydrators';
+        $configServiceName = sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name']);
 
-        $odmConfigDef = new Definition('%doctrine.odm.mongodb.configuration_class%');
-        $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name']), $odmConfigDef);
+        if ($container->hasDefinition($configServiceName)) {
+            $odmConfigDef = $container->getDefinition($configServiceName);
+        } else {
+            $odmConfigDef = new Definition('%doctrine.odm.mongodb.configuration_class%');
+            $container->setDefinition($configServiceName, $odmConfigDef);
+        }
 
         $this->loadDocumentManagerBundlesMappingInformation($documentManager, $odmConfigDef, $container);
         $this->loadDocumentManagerMetadataCacheDriver($documentManager, $container);
@@ -155,6 +160,9 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
             'setLoggerCallable' => array(new Reference('doctrine.odm.mongodb.logger'), 'logQuery'),
         );
         foreach ($methods as $method => $arg) {
+            if ($odmConfigDef->hasMethodCall($method)) {
+                $odmConfigDef->removeMethodCall($method);
+            }
             $odmConfigDef->addMethodCall($method, array($arg));
         }
 
@@ -308,7 +316,6 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
         return $connections;
     }
 
-
     /**
      * Loads an ODM document managers bundle mapping information.
      *
@@ -338,7 +345,8 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
      * In the case of bundles everything is really optional (which leads to autodetection for this bundle) but
      * in the mappings key everything except alias is a required argument.
      *
-     * @param array $entityManager A configured ORM entity manager.
+     * @param array $documentManager A configured ODM entity manager.
+     * @param Definition A Definition instance
      * @param ContainerBuilder $container A ContainerBuilder instance
      */
     protected function loadDocumentManagerBundlesMappingInformation(array $documentManager, Definition $odmConfigDef, ContainerBuilder $container)
@@ -349,7 +357,17 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
 
         $this->loadMappingInformation($documentManager, $container);
         $this->registerMappingDrivers($documentManager, $container);
-        
+
+        if ($odmConfigDef->hasMethodCall('setDocumentNamespaces')) {
+            // TODO: Can we make a method out of it on Definition? replaceMethodArguments() or something.
+            $calls = $odmConfigDef->getMethodCalls();
+            foreach ($calls AS $call) {
+                if ($call[0] == 'setDocumentNamespaces') {
+                    $this->aliasMap = array_merge($call[1][0], $this->aliasMap);
+                }
+            }
+            $method = $odmConfigDef->removeMethodCall('setDocumentNamespaces');
+        }
         $odmConfigDef->addMethodCall('setDocumentNamespaces', array($this->aliasMap));
     }