2011-07-07 7 views
10

Diğer dizileri aynı dizinde kaydettiren bir yükleyici paketim var (LoaderBundle).Symfony2'deki paketleri dinamik olarak kaydetmek mümkün mü?

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

el AppKernel::registerBundles() içinde (Acme dizinde) her yeni paket kayıt kaçınmak istiyorum. Tercihen, her bir istekte çalışmak için LoaderBundle'da bir şeyden hoşlanmam ve ToBeLoadedBundle1 ve ToBeLoadedBundle2'u dinamik olarak kaydetmem gerekir. Mümkün mü?

+0

deneyin güncellenmiş koddur PHP açık dizinleri ve/veya stat dosyaları yapmak için gerek yok. Büyük OS önbellekleriyle bile, bu performansa zarar verir. Tabii ki geliştirme için oldukça kullanışlı olabilir. – PAStheLoD

cevap

7

Untested ama önceki cevabı o ile sınıfını yer alacağını küçük bir hata içeriyordu şey

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

Teşekkürler. Çözümü düzeltmemi sağladı. Demetleri henüz kayıtlı olmasa bile normal olarak derslerle çalışabileceğimin farkında değildim. –

-2

gibi deneyebilirsiniz/önünde, burada

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