5

コンパイラパス内からカーネルにアクセスする方法はありますか?私はこれを試しました:

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

これはエラーをスローします。それを行う別の方法はありますか?

4

2 に答える 2

13

私の知る限り、カーネルはデフォルトでは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
}
于 2012-12-13T04:09:44.230 に答える
10

カーネル全体が必要な場合は、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 => 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;
    }
}
于 2014-09-25T08:41:15.537 に答える