Przeglądaj źródła

Enhancing Bundle CLI Command loading to allow a Bundle class to manually add commands to the Console Application instead of trying to read them from disk.

Jonathan H. Wage 15 lat temu
rodzic
commit
9cf9430430

+ 32 - 0
src/Symfony/Foundation/Bundle/Bundle.php

@@ -3,6 +3,7 @@
 namespace Symfony\Foundation\Bundle;
 
 use Symfony\Components\DependencyInjection\ContainerInterface;
+use Symfony\Components\Console\Application;
 
 /*
  * This file is part of the Symfony framework.
@@ -33,4 +34,35 @@ abstract class Bundle implements BundleInterface
   public function shutdown(ContainerInterface $container)
   {
   }
+
+  public function registerCommands(Application $application)
+  {
+    foreach ($application->getKernel()->getBundleDirs() as $dir)
+    {
+      $bundleBase = dirname(str_replace('\\', '/', get_class($this)));
+      $commandDir = $dir.'/'.basename($bundleBase).'/Command';
+      if (!is_dir($commandDir))
+      {
+        continue;
+      }
+
+      // look for commands
+      foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($commandDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file)
+      {
+        if ($file->isDir() || substr($file, -4) !== '.php')
+        {
+          continue;
+        }
+
+        $class = str_replace('/', '\\', $bundleBase).'\\Command\\'.str_replace(realpath($commandDir).'/', '', basename(realpath($file), '.php'));
+
+        $r = new \ReflectionClass($class);
+
+        if ($r->isSubclassOf('Symfony\\Components\\Console\\Command\\Command') && !$r->isAbstract())
+        {
+          $application->addCommand(new $class());
+        }
+      }
+    }
+  }
 }

+ 3 - 31
src/Symfony/Framework/WebBundle/Console/Application.php

@@ -80,37 +80,9 @@ class Application extends BaseApplication
 
   protected function registerCommands()
   {
-    // search all places where there are bundles
-    foreach ($this->kernel->getContainer()->getParameter('kernel.bundle_dirs') as $dir)
+    foreach ($this->kernel->getBundles() as $bundle)
     {
-      // search all registered bundles
-      foreach ($this->kernel->getBundles() as $bundle)
-      {
-        $bundleBase = dirname(str_replace('\\', '/', get_class($bundle)));
-        $commandDir = $dir.'/'.basename($bundleBase).'/Command';
-        if (!is_dir($commandDir))
-        {
-          continue;
-        }
-
-        // look for commands
-        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($commandDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file)
-        {
-          if ($file->isDir() || substr($file, -4) !== '.php')
-          {
-            continue;
-          }
-
-          $class = str_replace('/', '\\', $bundleBase).'\\Command\\'.str_replace(realpath($commandDir).'/', '', basename(realpath($file), '.php'));
-
-          $r = new \ReflectionClass($class);
-
-          if ($r->isSubclassOf('Symfony\\Components\\Console\\Command\\Command') && !$r->isAbstract())
-          {
-            $this->addCommand(new $class());
-          }
-        }
-      }
+      $bundle->registerCommands($this);
     }
   }
-}
+}