Cómo configurar parámetros externos en el contenedor de servicios

En el capítulo Cómo dominar y crear nuevos entornos, aprendiste cómo gestionar la configuración de tu aplicación. A veces, puedes beneficiar a tu aplicación almacenando ciertas credenciales fuera del código de tu proyecto. La configuración de la base de datos es tal ejemplo. La flexibilidad del contenedor de servicios de Symfony te permite hacer esto fácilmente.

Variables de entorno

Symfony grabará cualquier variable de entorno con el prefijo SYMFONY__ y lo configurará como parámetro en el contenedor de servicios. Los dobles guiones bajos son reemplazados por un punto, ya que un punto no es un carácter válido en un nombre de variable de entorno.

Por ejemplo, si estás usando Apache, las variables de entorno se pueden fijar usando la siguiente configuración de VirtualHost:

<VirtualHost *:80>
    ServerName      Symfony2
    DocumentRoot    "/ruta/a/aplic_symfony_2/web"
    DirectoryIndex  index.php index.html
    SetEnv          SYMFONY__DATABASE__USER usuario
    SetEnv          SYMFONY__DATABASE__PASSWORD secreto

    <Directory "/ruta/a/aplic_symfony_2/web">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

Nota

El ejemplo anterior es una configuración para Apache, con la directiva SetEnv. Sin embargo, esta funcionará para cualquier servidor web compatible con la configuración de variables de entorno.

Además, con el fin de que tu consola trabaje (la cual no utiliza Apache), las tienes que exportar como variables del intérprete. En un sistema Unix, puedes ejecutar las siguientes ordenes:

$ export SYMFONY__DATABASE__USER=usuario
$ export SYMFONY__DATABASE__PASSWORD=secreto

Ahora que has declarado una variable de entorno, estará presente en la variable global $_SERVER de PHP. Entonces Symfony automáticamente fijará todas las variables $_SERVER con el prefijo SYMFONY__ como parámetros en el contenedor de servicios.

Ahora puedes referirte a estos parámetros donde los necesites.

  • YAML
    doctrine:
        dbal:
            driver    pdo_mysql
            dbname:   symfony2_project
            user:     "%database.user%"
            password: "%database.password%"
    
  • XML
    <!-- xmlns:doctrine="http://symfony.com/schema/dic/doctrine" -->
    <!-- xsi:schemaLocation="http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> -->
    
    <doctrine:config>
        <doctrine:dbal
            driver="pdo_mysql"
            dbname="symfony2_project"
            user="%database.user%"
            password="%database.password%"
        />
    </doctrine:config>
    
  • PHP
    $container->loadFromExtension('doctrine', array(
        'dbal' => array(
            'driver'   => 'pdo_mysql',
            'dbname'   => 'symfony2_project',
            'user'     => '%database.user%',
            'password' => '%database.password%',
        )
    ));
    

Constantes

El contenedor también cuenta con apoyo para fijar constantes PHP como parámetros. See Constants as Parameters for more details.

Otra configuración

La directiva imports se puede utilizar para extraer parámetros almacenados en otro lugar. Importar un archivo PHP te da la flexibilidad de añadir al contenedor lo que sea necesario. La siguiente directiva importa un archivo llamado parameters.php.

  • YAML
    # app/config/config.yml
    imports:
        - { resource: parameters.php }
    
  • XML
    <!-- app/config/config.xml -->
    <imports>
        <import resource="parameters.php" />
    </imports>
    
  • PHP
    // app/config/config.php
    $loader->import('parameters.php');
    

Nota

Un archivo de recursos puede tener uno de muchos tipos. Los recursos PHP, XML, YAML, INI y cierre son compatibles con la directiva imports.

En parameters.php, dile al contenedor de servicios los parámetros que deseas configurar. Esto es útil cuando la configuración importante está en un formato no estándar. El siguiente ejemplo incluye la configuración de una base de datos Drupal en el contenedor de servicios de Symfony.

// app/config/parameters.php
include_once('/ruta/a/drupal/sites/default/settings.php');
$container->setParameter('drupal.database.url', $db_url);
Bifúrcame en GitHub