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