Nuevo en Symfony 3.4: Variables de entorno avanzadas

Symfony 4 utilizará y fomentará el uso de variables de entorno para configurar algunas partes de la aplicación. En Symfony 3.4, estamos trabajando para que esto sea posible y todos los componentes del framework sigan funcionando correctamente.

El único gran inconveniente que nos quedaba es que los valores de las variables de entorno siempre se convertían en cadenas de texto y eso es un gran problema cuando usas los type-hints de PHP 7.1. En el siguiente ejemplo:

public function connect(string hostname, int port)
{
    // ...
}

Si el valor del argumento $port se obtiene mediante una variable de entorno, entonces la aplicación no va a funcionar porque espera un número entero:

parameters:
    # este valor se convierte automáticamente en una cadena de texto
    app.connection.port: '%env(DATABASE_PORT)%'

En Symfony 3.4 hemos mejorado las variables de entorno para que puedan indicar el tipo de dato de sus valores. En la práctica, esto significa que puedes hacer una conversión de tipo de dato al obtener el valor de cualquier variable de entorno:

parameters:
    # equivalente a hacer esto en PHP: "(int) getenv('DATABASE_PORT')"
    app.connection.port: '%env(int:DATABASE_PORT)%'

Los tipos soportados para hacer la conversión son bool:, int:, float: y string:. ¡Pero todavía hay mucho más! También hemos añadido utilidades para realizar las transformaciones más habituales al obtener el valor de una variable de entorno (e incluso puedes combinarlas).

El operador resolve: por ejemplo reemplaza los parámetros del contenedor por sus valores:

parameters:
    project_dir: '/foo/bar'
    env(DB): 'sqlite://%%project_dir%%/var/data.db'
    db_dsn: '%env(resolve:DB)%'

El operador file: devuelve los contenidos del archivo cuya ruta se indica y el operador json: aplica la función json_decode() para transformar la cadena JSON dada en un array PHP. Combinando los dos, puedes por ejemplo obtener fácilmente los secretos guardados en formato JSON en algún archivo de configuración:

parameters:
    env(SECRETS_FILE): '/etc/secure/example.com/secrets.json'
    app.secrets: '%env(json:file:SECRETS_FILE)%'

El oprador base64: aplica la función base64_decode() al valor dado y el operador const: permite obtener el valor de cualquier constante PHP:

parameters:
    env(SOME_VALUE): 'NWE3OWExYzg2NmVmZWY5Y2ExODAwZjk3MWQ2ODlmM2U='
    app.some_value: '%env(base64:SOME_VALUE)%'

    env(NUM_ITEMS): 'App\Entity\BlogPost::NUM_ITEMS'
    app.num_items: '%env(const:NUM_ITEMS)%'

Por último, también puedes definir tus propios operadores. Para ello, crea un servicio que implemente EnvVarProcessorInterface y añádele la etiqueta container.env_var_processor.

Esta funcionalidad fue contribuida por Nicolas Grekas en el pull request #23901.

Fuente: New in Symfony 3.4: Advanced environment variables

Comentarios

Publicada el

25 de septiembre de 2017

Etiquetas

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.