如何在 Symfony4 结构的参数文件中检索我的环境变量?

How can I retrieve my environment variables in a parameter file in Symfony4 structure?

我使用 Symfony Flex 重新安装了 Symfony,新框架属于下一个 Symfony 4 目录结构。

我添加并配置了第一个第三方包:HWIOAuthBundle。此捆绑包用于使用两个秘密信息通过 Twitter 进行连接。

我在 config/packages/hwi_oauth.yaml 文件中声明了我的 consumer_idconsumer_secret

hwi_oauth:
    firewall_names: [secured_area]
    resource_owners:
        twitter:
            type:          twitter
            client_id:     XXXXXMyIdXXXXX
            client_secret: XXXXXMyTopSecretKeyXXXXX

我的应用程序工作正常。但是我不能在 github!

上提交我的秘密

我想要一个像这样的 hwi_oauth.yaml 文件:

hwi_oauth:
    firewall_names: [secured_area]
    resource_owners:
        twitter:
            type:          twitter
            client_id:     '%twitter_consumer_id%'
            client_secret: '%twitter_consumer_secret%'

我阅读了有关新 DotEnv 包的 Symfony4 best practices

Using environment variables, while far from being perfect, have many benefits over what we currently do. Environment variables are a more "standard" way of managing settings that depend on the environment (no need to manage a parameters.yml.dist for instance).

按照最佳实践的建议,我将这两行附加到 .env 文件:

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX

但是我遇到了这个错误:

You have requested a non-existent parameter "twitter_consumer_id".

我试过 %kernel.twitter_consumer_id% , %env.twitter_consumer_id% , %env(TWITTER_CONSUMER_ID)% 都没有成功。

上次测试返回此错误消息:

An exception has been thrown during the rendering of a template ("Environment variable not found: "TWITTER_CONSUMER_ID".").

如何在 hwi_oauth.yaml 这样的参数文件中检索我的 ENV 变量?

您需要在 bootstrap 过程中加载 .env 文件,以便这些环境变量可用:

(new DotEnv())->load(__DIR__ . '/../.env');

您应该计划将密钥放入开发、暂存和生产环境变量中。 不过,你如何做到这一点取决于。 在开发和暂存中,你可能使用 .env 文件,而在生产中你使用 Apache 注入。

就个人而言,我总是使用 .env 个文件,并且在我的存储库中保留一个空白文件。这样部署起来超级简单,而且没有任何特殊情况。

如果你只想在特定环境下使用.env个文件,你可以这样做:

if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) {
    (new DotEnv())->load(__DIR__ . '/../.env');
}

对于 test 环境,我还建议创建一个 bootstrap.php 脚本来覆盖 .env 参数:

tests/bootstrap.php:

<?php

use Symfony\Component\Dotenv\Dotenv;

require_once __DIR__.'/../vendor/autoload.php';

$dotEnv = new Dotenv();
$dotEnv->load(__DIR__.'/../.env');
$dotEnv->populate([
    'APP_ENV' => 'test',
    'DATABASE_URL' => '...'
    // ...
]);

phpunit.xml.dist:

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

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="tests/bootstrap.php" <--- set
         ...
>
    ...
</phpunit>