Nuevo en Symfony 4.1: Autowiring mejorado
Configurar argumentos escalares en los controladores
La opción _defaults.bind
del autowiring de servicios permite
inicializar argumentos por nombre o tipo. Por ejemplo, si defines el valor
del argumento $projectDir
de la siguiente manera, todos los servicios que
incluyan un argumento con ese mismo nombre en su constructor, recibirán su valor:
# config/services.yaml services: _defaults: bind: $projectDir: '%kernel.project_dir%'
Sin embargo, si alguna acción de un controlador define ese mismo argumento
$projectDir
, el autowiring no se aplica en ese caso y el argumento no tendrá
ningún valor:
/** * @Route("/do-something") */ public function somethingAction($projectDir) { // el argumento $projectDir no tiene el valor definido en _defaults.bind }
Por eso en los controladores tienes que usar algo como
$this->getParameter('kernel.project_dir')
o definir un constructor para
capturar el valor de este argumento. Como esto no es consistente con el resto de
servicios, en Symfony 4.1 lo hemos cambiado. Ahora ya puedes definir el valor de
los argumentos de los controladores mediante la opción _defaults.bind
y
funcionará igual que para los constructores de los servicios.
Esta funcionalidad fue contribuida por Ryan Weaver en el pull request #26658.
Autowiring y decoración de servicios
La decoración de servicios permite modificar el comportamiento de un servicio sin modificar el código del servicio original. Hasta ahora, la configuración de este tipo de servicios requería pasar el servicio decorado como argumento del servicio que lo está decorando. Además, había que usar una sintaxis especial:
# config/services.yaml services: # este es el servicio que quieres decorar App\Mailer: ~ App\DecoratingMailer: decorates: App\Mailer # es obligatorio pasar el servicio original como argumento y su # nombre debe ser "ID del servicio que lo decora" + ".inner" arguments: ['@App\DecoratingMailer.inner']
Esta configuración es un detalle interno de Symfony, así que en Symfony 4.1 no es necesaria, ya que se aplica el autowiring al servicio decorado. De forma que en 4.1, la configuración equivalente a la anterior es simplemente:
# config/services.yaml services: App\Mailer: ~ App\DecoratingMailer: decorates: App\Mailer
La configuración automática del servicio decorado se realiza cuando se cumplen estas condiciones:
- El servicio que decora usa autowiring;
- El constructor del servicio que decora solo tiene un argumento del tipo del servicio que está decorando.
Si no se cumplen estas condiciones, tienes que seguir utilizando la configuración anterior.
Esta funcionalidad fue contribuida por Kévin Dunglas en el pull request #25631.
Fuente: New in Symfony 4.1: Autowiring improvements
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.