2011-07-07 50 views
10

我有一個裝載程序包(LoaderBundle)應該在同一目錄中註冊其他包。是否有可能在Symfony2中動態註冊包?

/Acme/LoaderBundle/... 
/Acme/ToBeLoadedBundle1/... 
/Acme/ToBeLoadedBundle2/... 

我想避免在手動AppKernel::registerBundles()登記每個新束(在Acme目錄)。最好我想要LoaderBundle中的某些內容在每個請求上運行並動態註冊ToBeLoadedBundle1ToBeLoadedBundle2。可能嗎?

+0

嘗試避免需要使PHP打開目錄和/或stat文件。即使使用大操作系統緩存,這對性能也是不利的。當然,這對於開發來說可能非常方便。 – PAStheLoD

回答

7

未經測試,但你可以嘗試像

use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 
use Symfony\Component\Finder\Finder; 

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
     $bundles = array(
      new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 
      //... default bundles 
     ); 

     if (in_array($this->getEnvironment(), array('dev', 'test'))) { 
      $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 
      // ... debug and development bundles 
     } 

     $searchPath = __DIR__.'/../src'; 
     $finder  = new Finder(); 
     $finder->files() 
       ->in($searchPath) 
       ->name('*Bundle.php'); 

     foreach ($finder as $file) { 
      $path  = substr($file->getRealpath(), strlen($searchPath) + 1, -4); 
      $parts  = explode('/', $path); 
      $class  = array_pop($parts); 
      $namespace = implode('\\', $parts); 
      $class  = $namespace.'\\'.$class; 
      $bundles[] = new $class(); 
     } 

     return $bundles; 
    } 

    public function registerContainerConfiguration(LoaderInterface $loader) 
    { 
     $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 
    } 
} 
+0

謝謝。它確實導致我正確的解決方案。即使捆綁尚未註冊,我也沒有意識到我可以正常使用類。 –

-2

以前的答案包含一個小失誤,其中既包括有一類/門前,這裏是更新的代碼

foreach ($finder as $file) { 
      $path  = substr($file->getRealpath(), strrpos($file->getRealpath(), "src") + 4); 
      $parts  = explode('/', $path); 
      $class  = array_pop($parts); 
      $namespace = implode('\\', $parts); 
      $class  = $namespace.'\\'.$class; 
      //remove first slash 
      $class = substr($class, 1, -4); 
      $bundles[] = new $class(); 
     } 
相關問題