如何在服务容器中设置外部参数
在配置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); |