Nuevo en Symfony 4.3: Mejoradas las colecciones de servicios

Symfony incluye una funcionalidad para inyectar todos los servicios que tienen una determinada etiqueta, de manera que no tengas que crear un compiler pass solo para eso. En Symfony 4.3 hemos mejorado esta funcionalidad para que puedas indexar esos servicios usando tus propias claves.

En el siguiente ejemplo, los servicios etiquetados con app.handler definen un atributo extra llamado key. Este es el valor de la clave de cada elemento del array asociativo que se inyectará con todos los servicios etiquetados.

# config/services.yaml
services:
    App\Handler\One:
        tags:
            - { name: 'app.handler', key: 'handler_one' }
    App\Handler\Two:
        tags:
            - { name: 'app.handler', key: 'handler_two' }

    App\HandlerCollection:
        # 'index_by' indica el nombre del atributo que define la clave de cada servicio
        arguments: [!tagged { tag: 'app.handler', index_by: 'key' }]

Con esta configuración, el servicio HandlerCollection puede acceder a los servicios etiquetados utilizando los valores definidos en el atributo key:

// src/Handler/HandlerCollection.php
namespace App\Handler;
 
class HandlerCollection
{
    public function __construct(iterable $handlers)
    {
        $handlers = iterator_to_array($handlers);
        $handlerTwo = $handlers['handler_two'];
        // ...
    }
}

Si lo prefieres, en vez de definir el valor de la clave en cada etiqueta, puedes definirlo en un método estático llamado getDefaultIndexName() en la clase asociada al servicio. Usando esta alternativa, así es como sería el código de la clase App\Handler\One del ejemplo anterior:

// src/Handler/One.php
namespace App\Handler;
 
class One
{
    // ...
 
    public static function getDefaultIndexName(): string
    {
        return 'handler_one';
    }
}

Como en Symfony todo es configurable, el nombre del método estático se puede cambiar con el atributo default_index_method en la etiqueta que inyecta los servicios:

# config/services.yaml
services:
    # ...

    App\HandlerCollection:
        arguments: [!tagged { tag: 'app.handler', default_index_method: 'someCustomMethodName' }]

Esta funcionalidad fue contribuida por François-Xavier de Guillebon en el pull request #30257.

Fuente: New in Symfony 4.3: Indexed and Tagged Service Collections

Comentarios

Publicada el

23 de abril de 2019

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.