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