2011-06-24 11 views

Respuesta

25

CompilerPass implementaciones son algunos tipos de oyentes que se ejecutan después de que el contenedor de inyección de dependencias se crea a partir de archivos de configuración y antes de que se guarde como PHP simple en caché. Se usan para construir algunas estructuras que requieren acceso a definiciones de recursos externos o necesitan alguna programación que no está disponible en la configuración XML/YAML. Puede considerarlos como "filtros finales" que pueden modificar el DIC completo.

Consideremos un TwigBundle y es TwigEnvironmentPass. Lo que hace es bastante simple:

  1. buscar una referencia a twig servicio (definido como <service id="twig" class="..." ...>)
  2. Encuentra todos los servicios que ha sido etiquetado con twig.extension etiqueta. Para hacer eso, tiene que trabajar en DIC completo (creado a partir de archivos de configuración XML) ya que esos servicios pueden definirse en cualquier paquete.
  3. Crea un código personalizado para el método de creación de servicios.

Como resultado final se generará el siguiente código:

protected function getTwigService() 
{ 
    $this->services['twig'] = $instance = new \Twig_Environment($this->get('twig.loader'), ...); 

    // THIS HAS BEEN ADDED THANKS TO THE TwigEnvironmentPass: 
    $instance->addExtension(new \Symfony\Bundle\SecurityBundle\Twig\Extension\SecurityExtension($this->get('security.context'))); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TransExtension($this->get('translator'))); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TemplatingExtension($this)); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\FormExtension(array(0 => 'TwigBundle::form.html.twig', 1 => 'SiteBundle::widgets.html.twig'))); 
    $instance->addExtension(new \MyProject\SiteBundle\Twig\Extension\MyVeryOwnExtensionToTwig($this)); 

    return $instance; 
} 
+0

¡Buena explicación, gracias! – acme