Is there a way to automatically update AppKernel in symfony2?

Perhaps something similar to the generate command: bundle (which, after generating the package, requests an update to AppKernel) or Composer (which updates your startup using the dependencies that you install).

I want to get similar functionality for the generate: bundle package, but instead of creating a new package, I want to add the package I just downloaded, without having to manually edit AppKernel.

+4
source share
3 answers

I could not find an EXTEND way for the existing command, so I decided to create a new console command in the existing package.

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

Now you can execute it immediately after creating your package by doing

 php app/console yourbundle:appendnewbundle Your/SecondBundle 

This will add it to the list of existing packages.

 new Your\SecondBundle\YourSecondBundle(), 

This works if you have the standard (symfony2) AppKernel. Example:

 <?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'); } } 
+4
source

I have not tested it

 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); } } 
+1
source

Technically, of course, it’s possible, someone just has to do it.

-2
source

Source: https://habr.com/ru/post/1442253/


All Articles