Symfony 1.4, la guía definitiva

5.6. Trucos para los archivos de configuración

Antes de empezar a crear los primeros archivos YAML, existen algunos trucos muy útiles que es conveniente aprender. Estos trucos permiten evitar la duplicidad de la configuración y permiten personalizar el formato YAML.

5.6.1. Uso de constantes en los archivos de configuración YAML

Algunas opciones de configuración dependen del valor de otras opciones. Para evitar escribir 2 veces el mismo valor, Symfony permite definir constantes dentro de los archivos YAML. Si el manejador de los archivos se encuentra con un nombre de opción todo en mayúsculas y encerrado entre los símbolos % y %, lo reemplaza por el valor que tenga en ese momento. El listado 5-20 muestra un ejemplo.

Listado 5-20 - Uso de constantes en los archivos YAML, ejemplo extraído del archivo autoload.yml

autoload:
  symfony:
    name:           symfony
    path:           %SF_SYMFONY_LIB_DIR%
    recursive:      true
    exclude:        [vendor]

El valor de la opción path es el que devuelve en ese momento la llamada a sfConfig::get('sf_symfony_lib_dir'). Si un archivo de configuración depende de otro archivo, es necesario que el archivo del que se depende sea procesado antes (en el código de Symfony se puede observar el orden en el que se procesan los archivos de configuración). El archivo app.yml es uno de los últimos que se procesan, por lo que sus opciones pueden depender de las opciones de otros archivos de configuración.

Todas las constantes disponibles se describen en la guía de referencia de Symfony.

5.6.2. Uso de programación en los archivos de configuración

Puede ocurrir que los archivos de configuración dependan de parámetros externos (como por ejemplo una base de datos u otro archivo de configuración). Para poder procesar este tipo de casos, Symfony procesa los archivos de configuración como si fueran archivos de PHP antes de procesarlos como archivos de tipo YAML. De esta forma, como se muestra en el listado 5-21, es posible incluir código PHP dentro de un archivo YAML:

Listado 5-21 - Los archivos YAML puede contener código PHP

all:
  traduccion:
    formato:  <?php echo (sfConfig::get('sf_i18n') #### true ? 'xliff' : null)."\n" ?>

El único inconveniente es que la configuración se procesa al principio de la ejecución de la petición del usuario, por lo que no están disponibles ninguno de los métodos y funciones de Symfony.

Además, como la instrucción echo no añade ningún retorno de carro por defecto, es necesario añadirlo explícitamente mediante \n o mediante el uso del helper echoln para cumplir con el formato YAML:

all:
  traduccion:
    formato:  <?php echoln(sfConfig::get('sf_i18n') == true ? 'xliff' : 'none') ?>

Nota Recuerda que en el entorno de producción, se utiliza una cache para la configuración, por lo que los archivos de configuración solamente se procesan (y en este caso, se ejecuta su código PHP) una vez después de borrar la cache.

5.6.3. Utilizar tu propio archivo YAML

La clase sfYaml permite procesar de forma sencilla cualquier archivo en formato YAML. Se trata de un procesador parser) de archivos YAML que los convierte en arrays asociativos de PHP. El listado 5-22 muestra un archivo YAML de ejemplo y el listado 5-23 muestra como transformarlo en código PHP:

Listado 5-22 - Archivo de prueba llamado prueba.yml

casa:
  familia:
    apellido:      García
    padres:        [Antonio, María]
    hijos:         [Jose, Manuel, Carmen]
  direccion:
    numero:        34
    calle:         Gran Vía
    ciudad:        Cualquiera
    codigopostal:  12345

Listado 5-23 - Uso de la clase sfYaml para transformar el archivo YAML en un array asociativo

$prueba = sfYaml::load('/ruta/a/prueba.yml');
    print_r($prueba);

    Array(
      [casa] => Array(
        [familia] => Array(
          [apellido] => García
          [padres] => Array(
            [0] => Antonio
            [1] => María
          )
          [hijos] => Array(
            [0] => Jose
            [1] => Manuel
            [2] => Carmen
          )
        )
        [direccion] => Array(
          [numero] => 34
          [calle] => Gran Vía
          [ciudad] => Cualquiera
          [codigopostal] => 12345
        )
      )
    )