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