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:

  1. El servicio que decora usa autowiring;
  2. 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

Publicada el

15 de mayo de 2018

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.