Symfony 1.0, la guía definitiva

5.5. Accediendo a la configuración desde la aplicación

Los archivos de configuración se transforman en código PHP y la mayoría de sus opciones solamente son utilizadas por el framework. Sin embargo, en ocasiones es necesario acceder a los archivos de configuración desde el código de la aplicación (en las acciones, plantillas, clases propias, etc.) Se puede acceder a todas las opciones definidas en los archivos settings.yml, app.yml, module.yml, logging.yml y i18n.yml mediante una clase especial llamada sfConfig.

5.5.1. La clase sfConfig

Desde cualquier punto del código de la aplicación se puede acceder a las opciones de configuración mediante la clase sfConfig. Se trata de un registro de opciones de configuración que proporciona un método getter que puede ser utilizado en cualquier parte del código:

// Obtiene una opción
opcion = sfConfig::get('nombre_opcion', $valor_por_defecto);

También se pueden crear o redefinir opciones desde el código de la aplicación:

// Crear una nueva opción
sfConfig::set('nombre_opcion', $valor);

El nombre de la opción se construye concatenando varios elementos y separándolos con guiones bajos en este orden:

  • Un prefijo relacionado con el nombre del archivo de configuración (sf_ para settings.yml, app_ para app.yml, mod_ para module.yml, sf_i18n_ para i18n.yml y sf_logging_ para logging.yml)
  • Si existen, todas las claves ascendentes de la opción (y en minúsculas)
  • El nombre de la clave, en minúsculas

No es necesario incluir el nombre del entorno de ejecución, ya que el código PHP solo tiene acceso a los valores definidos para el entorno en el que se está ejecutando.

El listado 5-16 muestra el código necesario para acceder a los valores de las opciones definidas en el archivo app.yml mostrado en el listado 5-15.

Listado 5-15 - Ejemplo de configuración del archivo app.yml

all:
  .general:
    impuestos:    19.6
  usuario_por_defecto:
    nombre:       Juan Pérez
  email:
    webmaster:    [email protected]
    contacto:     [email protected]
dev:
  email:
    webmaster:    [email protected]
    contacto:     [email protected]

Listado 5-16 - Acceso a las opciones de configuración desde el entorno de desarrollo

echo sfConfig::get('app_impuestos');   // Recuerda que se ignora el nombre de la categoría
                                       // Es decir, no es necesario incluir 'general'
=> '19.6'
echo sfConfig::get('app_usuario_por_defecto_nombre');
=> 'Juan Pérez'
echo sfConfig::get('app_email_webmaster');
=> '[email protected]'
echo sfConfig::get('app_email_contacto');
=> '[email protected]'

Las opciones de configuración de Symfony tienen todas las ventajas de las constantes PHP, pero sin sus desventajas, ya que se puede modificar su valor durante la ejecución de la aplicación.

Considerando el funcionamiento que se ha mostrado, el archivo settings.yml que se utiliza para establecer las opciones del framework en cada aplicación, es equivalente a realizar varias llamadas a la función sfConfig::set(). Así que el listado 5-17 se interpreta de la misma forma que el listado 5-18.

Listado 5-17 - Extracto del archivo de configuración settings.yml

all:
  .settings:
    available:              on
    path_info_array:        SERVER
    path_info_key:          PATH_INFO
    url_format:             PATH

Listado 5-18 - Forma en la que Symfony procesa el archivo settings.yml

sfConfig::add(array(
  'sf_available' => true,
  'sf_path_info_array' => 'SERVER',
  'sf_path_info_key' => 'PATH_INFO',
  'sf_url_format' => 'PATH',
));

El Capítulo 19 explica el significado de las opciones de configuración del archivo settings.yml.

5.5.2. El archivo app.yml y la configuración propia de la aplicación

El archivo app.yml, que se encuentra en el directorio miproyecto/apps/miaplicacion/config/, contiene la mayoría de las opciones de configuración relacionadas con la aplicación. Por defecto el archivo está vacío y sus opciones se configuran para cada entorno de ejecución. En este archivo se deben incluir todas las opciones que necesiten modificarse rápidamente y se utiliza la clase sfConfig para acceder a sus valores desde el código de la aplicación. El listado 5-19 muestra un ejemplo.

Listado 5-19 - Archivo app.yml que define los tipos de tarjeta de crédito aceptados en un sitio

all:
  tarjetascredito:
    falsa:            off
    visa:             on
    americanexpress:  on

dev:
  tarjetascredito:
    falsa:            on

Para saber si las tarjetas de crédito falsas se aceptan en el entorno de ejecución de la aplicación, se debe utilizar la siguiente instrucción:

sfConfig::get('app_tarjetascredito_falsa');

Nota Si quieres definir un array de elementos bajo la clave all, es necesario que utilices el nombre de una categoría, ya que de otro modo Symfony trata cada uno de los valores de forma independiente, tal y como se muestra en el ejemplo anterior.

all:
  .array:
    tarjetascredito:
      falsa:             off
      visa:              on
      americanexpress:   on
print_r(sfConfig::get('app_tarjetascredito'));

Array(
  [falsa] => false
  [visa] => true
  [americanexpress] => true
)

Truco Cuando vayas a definir una constante o una opción dentro de un script, piensa si no sería mejor incluir esa opción en el archivo app.yml. Se trata del lugar más apropiado para guardar todas las opciones de la configuración.

Los requerimientos de algunas aplicaciones complejas pueden dificultar el uso del archivo app.yml. En este caso, se puede almacenar la configuración en cualquier otro archivo, con el formato y la sintaxis que se prefiera y que sea procesado por un manejador realizado completamente a medida. El Capítulo 19 explica en detalle el funcionamiento de los manejadores de configuraciones.