Contributed by
Nicolas Grekas
in #19681.

在管理程序配置方面,环境变量正变得愈发受欢迎。它们是the twelve-factor app(十二要素应用程序)理论中的主要概念之一。其主要先进性在于,它们可以在部署过程中“毋须任何代码改动”,乃至毋须放到代码宝库(code repository)中去接受检查。

打从第一天起,Symfony就支持环境变量,多亏了特殊的Symfony__变量。然而它们的行为却很简单:当程序的容器被构建时,那些环境变量的值将被剥离到(dumped into)已经编译好的容器之中。因此,如果这些变量在程序执行的时候被改变了,更新后的值将被忽略。

在Symfony 3.2中,我们添加了对环境变量的完整支持。第一个改进点就是,你不需要再为那些变量添加SYMFONY__前缀(任何变量名都能工作)。第二个改进之处,是它们的值将被实时解析,因此程序将始终使用更新后的值。

为了在Symfony的任意配置文件中使用一个环境变量,使用全新的%env(VARIABLE_NAME)%语法:

1
2
3
4
5
# app/config/config.yml
doctrine:
    dbal:
        # ...
        password: "%env(DB_PASSWORD)%"

上例中,只要Symfony/Doctrine需要数据库的密码,它们就会发起调用来获取DB_PASSWORD环境变量的值。为了避免“未定义变量”的错误产生,你可以使用env(VARIABLE_NAME): VARIABLE_VALUE语法来定义这些变量的默认值:

1
2
3
# app/config/parameters.yml
parameters:
    env(DB_PASSWORD): s3cr3t_1234