Nuevo en Symfony 3.4: inyectando servicios asociados a una etiqueta
En algunas aplicaciones Symfony es común obtener todos los servicios asociados a una determinada etiqueta. La solución tradicional para resolver este problema consistía en crear un compiler pass, buscar esos servicios e iterar sobre ellos. Sin embargo, crear el "compiler pass" solo para eso parece excesivo. Así que en Symfony 3.4 hemos añadido un atajo para que puedas obtener el mismo resultado sin tener que crear el "compiler pass".
Si utilizas YAML al definir los servicios, añade !tagged nombreDeLaEtiqueta
en
la propiedad arguments
para inyectar en un servicio todos los servicios
asociados a la etiqueta indicada. Por ejemplo, para inyectar todas las
extensiones de Twig en un servicio, haz lo siguiente:
services: App\Manager\TwigManager: arguments: [!tagged twig.extension]
Ahora ya puedes iterar sobre esos servicios:
// src/App/Manager/TwigManager.php namespace App\Manager; class TwigManager { public function __construct(iterable $twigExtensions) { // ... } }
Si utilizas XML en vez de YAML para configurar tus servicios, la notación cambia ligeramente:
<services> <service id="App\Manager\TwigManager"> <argument type="tagged" tag="twig.extension" /> </service> </services>
Por último, si quieres obtener los servicios en un determinado orden, añade el
atributo priority
a alguno de esos servicios o a todos ellos.
Esta funcionalidad fue contribuida por Roland Franssen en el Pull Request #22200.
Fuente: New in Symfony 3.4: Simpler injection of tagged services
Comentarios
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.