Como definir Parâmetros Externos no Container de Serviços

No capítulo Como Dominar e Criar novos Ambientes, você aprendeu como gerenciar a configuração da sua aplicação. Às vezes, armazenar certas credenciais fora do código do seu projeto pode beneficiar a sua aplicação. A configuração do banco de dados é um exemplo. A flexibilidade do container de serviço do Symfony permite à você fazer isso facilmente.

Variáveis ​​de Ambiente

O Symfony vai pegar qualquer variável de ambiente com o prefixo SYMFONY__ e setá-la como um parâmetro no container de serviço. Sublinhados duplos são substituídos por um ponto, pois o ponto não é um caracter válido no nome de uma variável de ambiente.

Por exemplo, se você está usando o Apache, as variáveis ​​de ambiente podem ser definidas utilizando a seguinte configuração VirtualHost:

<VirtualHost *:80>
    ServerName      Symfony2
    DocumentRoot    "/path/to/symfony_2_app/web"
    DirectoryIndex  index.php index.html
    SetEnv          SYMFONY__DATABASE__USER user
    SetEnv          SYMFONY__DATABASE__PASSWORD secret

    <Directory "/path/to/symfony_2_app/web">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

Nota

O exemplo acima é para uma configuração Apache, usando a diretiva SetEnv. No entanto, isso vai funcionar para qualquer servidor web que suporte a definição de variáveis ​​de ambiente.

Além disso, para que o seu console funcione (que não usa Apache), você deve exportar estas como variáveis ​​shell. Em um sistema Unix, você pode executar o seguinte:

$ export SYMFONY__DATABASE__USER=user
$ export SYMFONY__DATABASE__PASSWORD=secret

Agora que você declarou uma variável de ambiente, ela estará presente na variável global $_SERVER do PHP. O Symfony, então, automaticamente define todas as variáveis ​​``$_SERVER`` prefixadas com SYMFONY__ como parâmetros no container de serviços.

Agora, você pode referenciar estes parâmetros em qualquer local onde precisar deles.

  • 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

O container também possui suporte para definir constantes do PHP como parâmetros. Para aproveitar esse recurso, mapeie o nome da sua constante para uma chave de parâmetro , e defina o tipo como constant.

<?xml version="1.0" encoding="UTF-8"?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <parameters>
        <parameter key="global.constant.value" type="constant">GLOBAL_CONSTANT</parameter>
        <parameter key="my_class.constant.value" type="constant">My_Class::CONSTANT_NAME</parameter>
    </parameters>
</container>

Nota

Isso funciona somente para a configuração XML. Se você não está usando XML, simplesmente importe um arquivo XML para aproveitar essa funcionalidade:

# app/config/config.yml
imports:
    - { resource: parameters.xml }

Configurações Diversas

A diretiva imports pode ser usada para puxar os parâmetros armazenados em outro lugar. Importando um arquivo PHP lhe dá a flexibilidade para adicionar o que for necessário no container. O seguinte importa um arquivo chamado 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

Um arquivo de recursos pode ser um de muitos tipos. PHP, XML, YAML, INI e recursos de closure são todos suportados pela directiva imports.

No parameters.php, diga ao container de serviço os parâmetros que você deseja definir. Isto é útil quando alguma configuração importante está em um formato fora do padrão. O exemplo abaixo inclui a configuração de um banco de dados do Drupal no container de serviço do Symfony.

// app/config/parameters.php
include_once('/path/to/drupal/sites/default/settings.php');
$container->setParameter('drupal.database.url', $db_url);