Cómo trabajan los pases del compilador en los paquetes

Los pases del compilador te brindan la oportunidad de manipular otras definiciones de servicio que se han registrado en el contenedor de servicios. Puedes leer sobre su creación en la sección de componentes «Compilando el contenedor». Para registrar un pase del compilador desde un paquete, necesitas añadirlo al método constructor de la definición de la clase de tu paquete:

// src/Acme/MailerBundle/AcmeMailerBundle.php
namespace Acme\MailerBundle;

    use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;

use Acme\MailerBundle\DependencyInjection\Compiler\CustomCompilerPass;

class AcmeMailerBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $container->addCompilerPass(new CustomCompilerPass());
    }
}

Uno de los más comunes casos de uso de los pases del compilador es trabajar con servicios etiquetados (lee más acerca de las etiquetas en la sección de componentes «Trabajando con servicios etiquetados»). Si estás utilizando etiquetas personalizadas en un paquete, entonces por convención, los nombres de etiqueta consisten del nombre del paquete (en minúsculas, guiones bajos como separadores), seguidos por un punto y finalmente el nombre «real». Por ejemplo, si quieres introducir una especie de «transporte» en tu etiqueta AcmeMailerBundle, la debes nombrar acme_mailer.transport.

Bifúrcame en GitHub