Nuevo en Symfony 3.4: modificando el contenedor de servicios en el kernel

En Symfony 3.4, el kernel de la aplicación puede suscribirse a eventos implementando la interfaz EventSubscriberInterface y añadiendo los métodos necesarios para procesar los eventos. Ya que Symfony 4 creará aplicaciones sin bundles, en Symfony 3.4 hemos mejorado todavía más el kernel para que también pueda modificar el contenedor de servicios durante su construcción utilizando las compiler passes.

Para ello, el kernel tiene que implementar la interfaz CompilerPassInterface y añadir un método llamado process() donde se manipula el contenedor:

// src/Kernel.php
namespace App;
 
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
 
class Kernel extends BaseKernel implements CompilerPassInterface
{
    use MicroKernelTrait;
 
    // ...
 
    public function process(ContainerBuilder $container)
    {
        // añade aquí el código para manipular el contenedor de servicios...
 
        // puedes por ejemplo cambiar algún servicio:
        $container->getDefinition('app.some_private_service')->setPublic(true);
 
        // o procesar todos los servicios que tengan una etiqueta:
        foreach ($container->findTaggedServiceIds('some_tag') as $id => $tags) {
            // ...
        }
    }
}

La "compiler pass" que define el kernel es de tipo PassConfig::TYPE_BEFORE_OPTIMIZATION y su prioridad es -10000.

Esta funcionalidad fue contribuida por Nicolas Grekas en el Pull Request #24257.

Fuente: New in Symfony 3.4: Defining compiler passes in the kernel

Comentarios

Publicada el

5 de octubre de 2017

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.