2012-12-13 13 views

Odpowiedz

11

Z tego co wiem, Kernel domyślnie nie jest dostępny nigdzie w kompilatorze Compiler.

Ale można dodać go w ten sposób.

W swojej AppKernel przechodzą $ to wiązki karnet kompilator jest w

  • Dodaj konstruktora do Bundle obiektu, który przyjmuje Jądro jako parametr i przechowuje go jako właściwość.
  • W swojej funkcji Bundle :: build() przekazuj jądro do instancji CompilerPass.
  • W kompilatorze Compiler, w konstruktorze, aby zaakceptować jądro jako parametr i zapisać go jako właściwość.
  • Następnie możesz użyć $ this-> kernel w przepustce kompilatora.

// 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 
} 
+0

Wow, wielki odpowiedź. – orourkedd

6

Co samanime zaleca prace jeśli trzeba całego jądra.

Jeśli interesują Cię tylko niektóre wartości, które zawiera jądro, wystarczy użyć parametrów ustawionych przez symfony.

Oto lista dostępnych nich:

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 
) 

Na przykład kernel.bundles zawiera listę wszystkich zarejestrowanych wiązek w formacie [bundle => class].

PS: I pobrane do tej listy za pomocą następującego kompilatora pass:

<?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; 
    } 
} 
+0

Jeśli potrzebujesz, powiedzmy, 'kernel.environment', możesz uzyskać to tak: ' $ container-> getParameter ('kernel.environment') ' –

Powiązane problemy