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