2011-07-07 9 views
10

Mam pakiet ładujący (LoaderBundle), który powinien zarejestrować inne pakiety w tym samym katalogu.Czy możliwe jest dynamiczne rejestrowanie pakietów w Symfony2?

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

Chciałbym uniknąć ręcznej rejestracji każdy nowy pakiet (w Acme katalogu) w AppKernel::registerBundles(). Najlepiej chciałbym, aby coś w LoaderBundle działało na każde żądanie i dynamicznie rejestrowało ToBeLoadedBundle1 i ToBeLoadedBundle2. Czy to możliwe?

+0

Spróbuj unikaj tworzenia otwartych katalogów PHP i/lub plików statystyk. Nawet w przypadku dużych pamięci podręcznych systemu operacyjnego jest to szkodliwe dla wydajności. Oczywiście może być bardzo przydatny do rozwoju. – PAStheLoD

Odpowiedz

7

Nietestowane ale można próbować coś

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

Dzięki. Doprowadziło mnie to do poprawnego rozwiązania. Nie zdawałem sobie sprawy, że mogę normalnie pracować z klasami, nawet jeśli pakiety nie są jeszcze zarejestrowane. –

-2

poprzednią odpowiedź zawierała mały błąd, gdzie byłoby zaliczyć klasę z/do przodu, tutaj jest zaktualizowany kod

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(); 
     } 
Powiązane problemy