فهرست منبع

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 سال پیش
والد
کامیت
9cf9430430
2فایلهای تغییر یافته به همراه35 افزوده شده و 31 حذف شده
  1. 32 0
      src/Symfony/Foundation/Bundle/Bundle.php
  2. 3 31
      src/Symfony/Framework/WebBundle/Console/Application.php

+ 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);
     }
   }
-}
+}