Symfony2-从编译器过程访问内核

Symfony2-从编译器过程访问内核,symfony,kernel,Symfony,Kernel,有没有一种方法可以从编译器内部访问内核?我试过这个: ... public function process(ContainerBuilder $container) { $kernel = $container->get('kernel'); } ... 这会抛出一个错误。还有其他方法吗?据我所知,默认情况下,编译器类中的任何地方都没有内核 但您可以通过执行以下操作来添加它: 在AppKernel中,将$this传递给编译器传递所

有没有一种方法可以从编译器内部访问内核?我试过这个:

    ...
    public function process(ContainerBuilder $container)
    {
        $kernel = $container->get('kernel');
    }
    ...

这会抛出一个错误。还有其他方法吗?

据我所知,默认情况下,编译器类中的任何地方都没有内核

但您可以通过执行以下操作来添加它:

在AppKernel中,将$this传递给编译器传递所在的包

  • 将构造函数添加到Bundle对象中,该对象接受内核作为参数并将其存储为属性
  • 在Bundle::build()函数中,将内核传递给编译器类实例
  • 在编译器类中,在构造函数中接受内核作为参数并将其存储为属性
  • 然后可以在编译器过程中使用$this->kernel


如果需要修改整个内核,samanime推荐的方法是有效的

如果您只是对内核包含的一些值感兴趣,那么只使用symfony设置的参数就足够了

以下是可用的列表:

Array
(
    [0] => kernel.root_dir
    [1] => kernel.environment
    [2] => kernel.debug
    [3] => kernel.name
    [4] => kernel.cache_dir
    [5] => kernel.logs_dir
    [6] => kernel.bundles
    [7] => kernel.charset
    [8] => kernel.container_class
    [9] => kernel.secret
    [10] => kernel.http_method_override
    [11] => kernel.trusted_hosts
    [12] => kernel.trusted_proxies
    [13] => kernel.default_locale
)
例如,
kernel.bundles
包含所有注册bundle的列表,格式为
[bundle=>class]

PS:我使用以下编译器过程获取此列表:

<?php
namespace Acme\InfoBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class InfoCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        print_r(array_values(array_filter(
            array_keys($container->getParameterBag()->all()), 
            function ($e) {
                return strpos($e, 'kernel') === 0;
            }
        )));
        die;
    }
}

如果您需要,比如说,
kernel.environment
,您可以这样获得它:
$container->getParameter('kernel.environment')
<?php
namespace Acme\InfoBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class InfoCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        print_r(array_values(array_filter(
            array_keys($container->getParameterBag()->all()), 
            function ($e) {
                return strpos($e, 'kernel') === 0;
            }
        )));
        die;
    }
}