Symfony2 - 从编译器 channel 访问内核

标签 symfony symfony-http-kernel

有没有办法从编译器传递内部访问内核?我试过这个:

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

这会引发错误。还有另一种方法吗?

最佳答案

据我所知,默认情况下,内核在 CompilerPass 中的任何地方都不可用。

但是你可以通过这样做来添加它:

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

  • 向您的 Bundle 对象添加一个构造函数,它接受内核作为参数并将其存储为属性。
  • 在您的 Bundle::build() 函数中,将内核传递给您的 CompilerPass 实例。
  • 在您的 CompilerPass 中,在构造函数处接受内核作为参数并将其存储为属性。
  • 然后您可以在编译器传递中使用 $this->kernel 。

  • // app/AppKernel.php
    new My\Bundle($this);
    
    // My\Bundle\MyBundle.php
    use Symfony\Component\HttpKernel\KernelInterface;
    
    class MyBundle extends Bundle {
    protected $kernel;
    
    public function __construct(KernelInterface $kernel)
    {
      $this->kernel = $kernel;
    }
    
    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $container->addCompilerPass(new MyCompilerPass($this->kernel));
    }
    
    // My\Bundle\DependencyInjection\MyCompilerPass.php
    use Symfony\Component\HttpKernel\KernelInterface;
    
    class MyCompilerPass implements CompilerPassInterface
    protected $kernel;
    
    public function __construct(KernelInterface $kernel)
    {
       $this->kernel = $kernel;
    }
    
    public function process(ContainerBuilder $container)
    {
        // Do something with $this->kernel
    }
    

    关于Symfony2 - 从编译器 channel 访问内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852611/

    相关文章:

    php - 使用 Symfony 2 在 Twig 模板中获取内核根目录

    symfony - Symfony2 中的服务依赖注入(inject)

    Symfony - 设置 Flash 并检查 TWIG

    Symfony EasyAdmin bundle 一对多

    symfony - 如何在 Symfony2 中注册多个身份验证提供程序?

    mysql - 删除 ID 最低的条目

    php - Graylog2 与 Symfony 2 (Monolog)

    Symfony2 内核与 HttpKernel