Переглянути джерело

[DoctrineBundle] Fixes for building when you have multiple bundles which mixes mapping information types

Jonathan H. Wage 15 роки тому
батько
коміт
2db073b03a

+ 21 - 10
src/Symfony/Framework/DoctrineBundle/Command/BuildEntitiesDoctrineCommand.php

@@ -46,21 +46,32 @@ class BuildEntitiesDoctrineCommand extends DoctrineCommand
    */
   protected function execute(InputInterface $input, OutputInterface $output)
   {
-    foreach ($this->container->getParameter('kernel.bundle_dirs') as $bundle => $path)
+    $dirs = array();
+    $bundleDirs = $this->container->getKernelService()->getBundleDirs();
+    foreach ($this->container->getKernelService()->getBundles() as $bundle)
     {
-      $bundles = glob($path.'/*Bundle');
-      foreach ($bundles as $p)
+      $tmp = dirname(str_replace('\\', '/', get_class($bundle)));
+      $namespace = str_replace('/', '\\', dirname($tmp));
+      $class = basename($tmp);
+
+      if (isset($bundleDirs[$namespace]))
       {
-        if (!is_dir($metadataPath = $p.'/Resources/config/doctrine/metadata'))
+        if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Entities'))
         {
-          continue;
+          $this->convertMapping($dir, $bundleDirs[$namespace].'/..');
+        } else if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/config/doctrine/metadata')) {
+          $this->convertMapping($dir, $bundleDirs[$namespace].'/..');
         }
-        $opts = array();
-        $opts['--from'] = $metadataPath;
-        $opts['--to'] = 'annotation';
-        $opts['--dest'] = realpath($path.'/..');
-        $this->runCommand('doctrine:convert-mapping', $opts);
       }
     }
   }
+
+  protected function convertMapping($mappingPath, $dest)
+  {
+    $opts = array();
+    $opts['--from'] = $mappingPath;
+    $opts['--to'] = 'annotation';
+    $opts['--dest'] = realpath($dest);
+    $this->runCommand('doctrine:convert-mapping', $opts);
+  }
 }

+ 8 - 3
src/Symfony/Framework/DoctrineBundle/Command/DoctrineCommand.php

@@ -33,6 +33,7 @@ use Doctrine\Common\Cli\CliController as DoctrineCliController;
 abstract class DoctrineCommand extends Command
 {
   protected
+    $application,
     $cli,
     $em;
 
@@ -80,12 +81,16 @@ abstract class DoctrineCommand extends Command
 
   protected function runCommand($name, array $input = array())
   {
+    if ($this->application === null)
+    {
+      $this->application = new Application($this->container->getKernelService());
+    }
+
     $arguments = array();
     $arguments = array_merge(array($name), $input);
     $input = new ArrayInput($arguments);
-    $application = new Application($this->container->getKernelService());
-    $application->setAutoExit(false);
-    $application->run($input);
+    $this->application->setAutoExit(false);
+    $this->application->run($input);
   }
 
   /**

+ 22 - 7
src/Symfony/Framework/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -204,14 +204,29 @@ class DoctrineExtension extends LoaderExtension
         $namespace = str_replace('/', '\\', dirname($tmp));
         $class = basename($tmp);
 
-        if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/config/doctrine/metadata'))
+        if (isset($bundleDirs[$namespace]))
         {
-          $type = $this->detectMappingType($dir);
-          $mappingDriverDef->addMethodCall('addDriver', array(
-              new Reference(sprintf('doctrine.orm.metadata_driver.%s', $type)),
-              $namespace.'\\'.$class.'\\Entities'
-            )
-          );
+          if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/config/doctrine/metadata'))
+          {
+            $type = $this->detectMappingType($dir);
+          }
+          elseif (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Entities'))
+          {
+            $type = 'annotation';
+          }
+          else
+          {
+            $type = false;
+          }
+
+          if (false !== $type)
+          {
+            $mappingDriverDef->addMethodCall('addDriver', array(
+                new Reference(sprintf('doctrine.orm.metadata_driver.%s', $type)),
+                $namespace.'\\'.$class.'\\Entities'
+              )
+            );
+          }
         }
       }