[Symfony] Procesadores de variables de entorno

Ya hace mucho que sabía de los procesadores de variables de entorno de Symfony, pero hace poco he descubierto que es posible crear procesadores personalizados. Y lo mejor de todo es que es extremadamente sencillo.

¿Qué son los procesadores de variables de entorno?

Pues son básicamente una poderosa sintaxis que puedes usar en tus ficheros de configuración para transformar y enriquecer los valores de las variables de entorno antes de usarlos en la configuración de tu aplicación.

Digamos que tienes una variable de entorno llamada REDIS_PORT y que necesitas pasarla como argumento a un servicio. Digamos que dicho argumento solo acepta variables de tipo entero. El problema que esto supone es que si usas la sintaxis '%env(REDIS_PORT)%', así sin más, estarás pasando una cadena, no un entero, lo que ocasionará un error de tipado. Esto es así porque las variables de entorno siempre contienen cadenas de caracteres, aunque el valor que contenga sea, digamos, un número de puerto.

¡Procesadores de variables al rescate!

La solución no puede ser más sencilla. Uno de los procesadores de variable que proporciona Symfony es int, cuyo cometido es convertir a entero el valor de la variable. Para usarlo solo tienes que prefijar el nombre de la variable con el prefijo int:, es decir '%env(int:REDIS_PORT)%'.

Además de int, Symfony proporciona otros muchos. He aquí algunos de los más usados:

  • float, bool, string: Convierte el valor a un tipo de dato específico.
  • not: Igual que bool, pero devuelve el valor booleano invertido.
  • default: Asigna un valor predeterminado si la variable de entorno no está definida.
  • file: Lee y devuelve el contenido de un archivo.
  • url: Parsea una URL y devuelve un array asociativo con sus partes (host, port, path, user…).
  • query_string: Parsea la cadena de consulta de una URL y devuelve un array con sus parámetros.

Procesadores personalizados

Como decía al principio, la característica más potente de esta funcionalidad de Symfony es que puedes crear tus propios procesadores, y es tan fácil como crear una clase que implemente el interfaz EnvVarProcessorInterface. Por ejemplo, vamos a crear un sencillo procesador que convierta a mayúsculas el contenido de la variable:

use Symfony\Component\DependencyInjection\EnvVarProcessorInterface;

class ShoutEnvVarProcessor implements EnvVarProcessorInterface
{
    public function getEnv(string $prefix, string $name, \Closure $getEnv): string
    {
        $env = $getEnv($name); // Necesario para poder encadenar procesadores

        return strtoupper($env); // haz aquí lo que quieras con tu variable
    }

    public static function getProvidedTypes(): array
    {
        return [
            'gritando' => 'string', // Lista de procesadores y los tipos que aceptan
        ];
    }
}

Y eso es todo. Si tienes tu proyecto Symfony configurado como viene por defecto (con autoconfiguración de servicios), este detectará automáticamente tu nueva clase y generará un nuevo procesador de variables que podrás usar en cualquier fichero de configuración. En este caso, tal que así: '%env(gritando:HOME)%'.

El límite es tu imaginación. Puedes trocear una cadena, o el contenido de un fichero, y devolver los trozos en forma de array, etc.

¡Feliz procesamiento!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.