Можно ли динамически регистрировать пакеты в Symfony2? - PullRequest
12 голосов
/ 07 июля 2011

У меня есть пакет загрузчика (LoaderBundle), который должен регистрировать другие пакеты в том же каталоге.

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

Я бы хотел избежать ручной регистрации каждого нового пакета (в каталоге AcmeAppKernel::registerBundles().Желательно, чтобы что-то в LoaderBundle запускалось при каждом запросе и динамически регистрировало ToBeLoadedBundle1 и ToBeLoadedBundle2.Возможно ли это?

Ответы [ 2 ]

9 голосов
/ 07 июля 2011

Не проверено, но вы можете попробовать что-то вроде

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 голосов
/ 28 июня 2013

Предыдущий ответ содержал небольшую ошибку, где он включал бы класс с / перед, вот обновленный код

 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...