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

Publicada el

9 de octubre de 2017

Etiquetas

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.