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
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.