Symfony 4 将推进和利用环境变量来对程序的某些部分进行配置。在 Symfony 3.4 中我们努力令其完全成为可能。最后的一个障碍是,环境变量始终要转换为字符串。这在使用 PHP 7.1 的 type-hints 时是一个很大的问题:

1
2
3
4
public function connect(string hostname, int port)
{
    // ...
}

如果 port 是通过一个 env var 获取到的,程序将无法工作,因为该参数将是一个字符串而非预期的整型:

1
2
parameters:
    app.connection.port: '%env(DATABASE_PORT)%'

在 Symfony 3.4 中我们 改进了环境变量的处理 以支持 type casting。当引用一个 env var 时,你现在可以设置希望把它的值给转换成的类型了:

1
2
3
4
parameters:
    # roughly equivalent to "(int) getenv('DATABASE_PORT')"
    # 基本等同于 "(int) getenv('DATABASE_PORT')"
    app.connection.port: '%env(int:DATABASE_PORT)%'

我们包括了对 bool:, int:, float:string: casting 的支持。但不止于此!我们也增加了一些功能来实现更为常见的 env vars 操作 (并且你可以参合使用它们)。

resolve: 利用它们的值来替换container parameter names(容器参数名称):

1
2
3
4
parameters:
    project_dir: '/foo/bar'
    env(DB): 'sqlite://%%project_dir%%/var/data.db'
    db_dsn: '%env(resolve:DB)%'

file: 操作符获取给定文件的内容,而 json: 操作符把给定内容反解成一个 PHP 数组,因此你可以将其组合以获取存储在某些文件中的秘密:

1
2
3
parameters:
    env(SECRETS_FILE): '/etc/secure/example.com/secrets.json'
    app.secrets: '%env(json:file:SECRETS_FILE)%'

base64: 操作符反解给定的 base64 内容,而 const: 允许你引用任何 PHP 常量:

1
2
3
4
5
6
parameters:
    env(SOME_VALUE): 'NWE3OWExYzg2NmVmZWY5Y2ExODAwZjk3MWQ2ODlmM2U='
    app.some_value: '%env(base64:SOME_VALUE)%'

    env(NUM_ITEMS): 'App\\Entity\\BlogPost::NUM_ITEMS'
    app.num_items: '%env(constant:NUM_ITEMS)%'