如何在服务容器中设置外部参数

配置Symfony(和环境)章节中,你已了解如何去管理你的程序配置。有时,存储一些“项目代码以外”的特定凭据(credentials),对你的程序是有好处的。数据库配置就是这种例子之一。Symfony服务容器的灵活性使你能够轻松实现它。

环境变量 

Symofny将抓取每一个前缀是SYMFONY_的环境变量,然后把它设置为服务容器的参数(parameter)。有一些转换会施加到用作结果的参数名称上:

  • SYMFONY__前缀会被移除;

  • 参数名称全部小写;

  • 双下划线(__)被替换为一个英文半角句号,因为句号在环境变量名中并非有效字符。

例如,若你使用Apache,环境变量可以使用下面的VirtualHost配置进行设定:

1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
    ServerName      Symfony
    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>

上例是Apache的配置,使用SetEnv指令。然而,它却能运行在任何“支持环境变量设置”的web服务器之上。

同时,为了让你的命令行能够工作(它不使用Apache),你必须把它们导出为shell变量。在Unix系统上,你可以运行如下命令:

1
2
$  export SYMFONY__DATABASE__USER=user
$  export SYMFONY__DATABASE__PASSWORD=secret

现在你已声明了一个环境变量,它将由PHP的$_SERVER超全局变量所呈现。Symfony接下来会自动为所有$_SERVER变量添加SYMFONY__前缀,作为服务容器的参数。

在需要时你可以随处引用这些参数:

1
2
3
4
5
6
doctrine:
    dbal:
        driver:   pdo_mysql
        dbname:   symfony_project
        user:     '%database.user%'
        password: '%database.password%'
1
2
3
4
5
6
7
8
9
10
11
<!-- 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="symfony_project"
        user="%database.user%"
        password="%database.password%"
    />
</doctrine:config>
1
2
3
4
5
6
7
8
$container->loadFromExtension('doctrine', array(
    'dbal' => array(
        'driver'   => 'pdo_mysql',
        'dbname'   => 'symfony_project',
        'user'     => '%database.user%',
        'password' => '%database.password%',
    )
));

常量 

容器也支持把PHP常量设置为参数(parameters)。参考常量参数以了解更多细节。

杂项配置 

imports指令可以用于取得存在别处的参数。导入一个PHP文件给了你“向容器中添加任意需要内容”的灵活性。下例导入了一个名为parameters.php的文件:

1
2
3
# app/config/config.yml
imports:
    - { resource: parameters.php }
1
2
3
4
<!-- app/config/config.xml -->
<imports>
    <import resource="parameters.php" />
</imports>
1
2
// app/config/config.php
$loader->import('parameters.php');

资源文件可以是任意类型。PHP、XML、YAML、INI以及closure resources统统被imports指令所支持。

parameters.php中,告诉服务容器你希望设置的参数。当重要配置信息并非标准格式时,这是有用的。下例是把一个Drupal数据库配置信息给包容到Symfony的服务容器中:

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

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)