gpt4 book ai didi

php - 有没有办法自动更新 symfony2 中的 AppKernel?

转载 作者:可可西里 更新时间:2023-10-31 23:07:39 29 4
gpt4 key购买 nike

可能类似于 generate:bundle 命令(生成 bundle 后提示更新 AppKernel)或 Composer(使用安装的依赖项更新自动加载)。

我想获得与 generate:bundle 类似的功能,但我不想创建一个新的包,而是想添加一个我刚下载的包,而无需手动编辑 AppKernel。

最佳答案

我找不到扩展现有命令的方法,所以我想在现有包中创建一个新的控制台命令。

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

这会将其附加到现有 bundle 列表中

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

关于php - 有没有办法自动更新 symfony2 中的 AppKernel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13082254/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com