Есть ли способ автоматически обновить AppKernel в symfony2?

Возможно, что-то похожее на команду generate: bundle (которая после генерации пакета запрашивает обновление AppKernel) или Composer (который обновляет вашу автозагрузку с установленными зависимостями).

Я хочу получить аналогичную функциональность для пакета generate: bundle, но вместо создания нового пакета я хочу добавить пакет, который я только что загрузил, без необходимости вручную редактировать AppKernel.

Я не мог найти способ EXTEND существующей команды, поэтому я решил создать новую консольную команду в существующем комплекте.

namespace Your\OriginalBundle\Command; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class AppendNewBundleCommand extends ContainerAwareCommand { protected $appKernel; protected function configure() { $this ->setName('yourbundle:appendnewbundle') ->setDescription('Append a new bundle to the AppKernel.php') ->addArgument('namespace', InputArgument::REQUIRED, 'Define your new bundle/namespace') ; $this->appKernel = __DIR__.'/../../../../app/AppKernel.php'; } protected function execute(InputInterface $input, OutputInterface $output) { if (!file_exists($this->appKernel)) { throw new \ErrorException(sprintf("Could not locate file %s",$this->appKernel)); } if (!is_writable($this->appKernel)) { throw new \ErrorException(sprintf('Cannot write into AppKernel (%s)',$this->appKernel)); } $namespace = $input->getArgument('namespace'); $appContent = file_get_contents($this->appKernel); $bundle = str_replace("/","\\",$namespace)."\\".str_replace("/","",$namespace); $newBundle = "new {$bundle}(),"; $pattern = '/\$bundles\s?=\s?array\((.*?)\);/is'; preg_match($pattern, $appContent,$matches); $bList = rtrim($matches[1],"\n "); $e = explode(",",$bList); $firstBundle = array_shift($e); $tabs = substr_count($firstBundle,' '); $newBList = "\$bundles = array(" .$bList."\n" .str_repeat(' ', $tabs).$newBundle."\n" .str_repeat(' ',$tabs-1).");"; file_put_contents($this->appKernel,preg_replace($pattern,$newBList,$appContent)); } } 

Теперь вы можете выполнить его, сразу после создания своего пакета, выполнив

 php app/console yourbundle:appendnewbundle Your/SecondBundle 

Это добавит это в список существующих пакетов

 new Your\SecondBundle\YourSecondBundle(), 

Это работает, если у вас есть стандартный (symfony2) AppKernel. Пример:

 <?php use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Config\Loader\LoaderInterface; class AppKernel extends Kernel { public function registerBundles() { $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Symfony\Bundle\DoctrineBundle\DoctrineBundle(), new Symfony\Bundle\AsseticBundle\AsseticBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(), new Ornicar\ApcBundle\OrnicarApcBundle(), new Your\OriginalBundle\YourOriginalBundle(), ); if (in_array($this->getEnvironment(), array('dev', 'test'))) { $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); } return $bundles; } public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); } } 

я не тестировал его

 use Symfony\Component\HttpKernel\KernelInterface; use Sensio\Bundle\GeneratorBundle\Manipulator\KernelManipulator; use RuntimeException; class SomeClass { /** * Register bundle in Kernel * @param KernelInterface $kernel * @param sting $namespace * @param sting $bundle * @return boolean * @throws RuntimeException When bundle already defined in <comment>AppKernel::registerBundles()</comment> */ protected function registerBundle(KernelInterface $kernel, $namespace, $bundle) { $manip = new KernelManipulator($kernel); return $manip->addBundle($namespace.'\\'.$bundle); } } 

Технически это, конечно, возможно, кто-то просто должен это сделать.