Nuevo en Symfony 3.4: configuración local de servicios

La configuración de los servicios se ha simplificado drásticamente en las versiones de Symfony más recientes. Gracias al autowiring puedes crear y usar servicios sin tener que configurarlos explícitamente (al menos la mayoría de ellos).

La principal excepción son los servicios que utilizan argumentos de tipo escalar (cadenas de texto y números). Si por ejemplo en tu aplicación tienes tres servicios que necesitan el valor del parámetro kernel.project_dir, debes hacer lo siguiente:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    App\Some\Service1:
        $projectDir: '%kernel.project_dir%'

    App\Some\Service2:
        $projectDir: '%kernel.project_dir%'

    App\Some\Service3:
        $projectDir: '%kernel.project_dir%'

En Symfony 3.4, para evitar tener que configurar todo esto, hemos añadido una funcionalidad llamada "configuración local de servicios" ("local service binding" en inglés). En primer lugar, esta funcionalidad permite definir los argumentos una sola vez y aplicarlos en todos los servicios creados/definidos en ese archivo. Así que el ejemplo anterior queda de la siguiente manera en Symfony 3.4:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
            $projectDir: '%kernel.project_dir%'

¡Y ya está! No tienes que definir los servicios Service1, Service2 y Service3 porque el "autowiring" está activado y ya has definido el valor del argumento $projectDir que necesitan todos ellos. Si utilizas XML para configurar los servicios, así es como puedes configurar estos argumentos:

<services>
    <defaults autowire="true" autoconfigure="true" public="false">
        <bind key="$projectDir">%kernel.project_dir%</bind>
    </defaults>
</services>

Esta configuración local de servicios también es útil para definir explícitamente qué servicios se inyectan en cada caso. Esto es por ejemplo necesario cuando tienes varios servicios asociados a la misma clase:

# cuando los servicios creados/definidos en este archivo inyecten 'BarInterface'
# utiliza el servicio '@normal_bar_service' ...
services:
    _defaults:
        bind:
            BarInterface: '@normal_bar_service'
 
    # ... excepto para este servicio concreto, donde se inyecta un servicio diferente
    Foo:
        bind:
            BarInterface: '@special_bar_service'

Esta funcionalidad fue contribuida por Guilhem Niot en el Pull Request #22187.

Fuente: New in Symfony 3.4: Local service binding

Comentarios

Publicada el

16 de octubre de 2017

Etiquetas

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.