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

9
我使用Symfony Flex进行了全新的Symfony安装,并使用新的骨架属于下一个Symfony 4目录结构。
我添加并配置了第一个第三方bundle: HWIOAuthBundle。该bundle用于使用两个秘密信息通过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%'

我阅读了Symfony4最佳实践关于新的DotEnv包的内容。

使用环境变量,虽然远非完美,但比我们目前所做的有许多优点。环境变量是管理依赖于环境的设置的更加“标准”的方式(例如,无需管理parameters.yml.dist)。

如最佳实践建议,我将这两行代码添加到.env文件中:
TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX

但我遇到了这个错误:

您请求了一个不存在的参数“twitter_consumer_id”。

我尝试使用 %kernel.twitter_consumer_id%%env.twitter_consumer_id%%env(TWITTER_CONSUMER_ID)%,但都没有成功。

最后一个测试返回了这个错误信息:

在模板渲染期间抛出了异常(“找不到环境变量:“TWITTER_CONSUMER_ID”。”)。

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


1
你是否正在使用 DotEnv 组件加载 .env 文件? - bishop
谢谢@bishop!public\index.php包含if (!getenv('APP_ENV')) { (new Dotenv())->load(__DIR__.'/../.env'); },但是这个.env没有被加载。现在它可以工作了!但是检查是为了确保我们不在生产中使用.env。我不明白如何在开发中使用它并仍然保护我的生产环境...将测试!getenv('APP_ENV')替换为in_array(getenv('APP_ENV'), ['dev','test'])是否安全? - Alexandre Tranchant
2个回答

8
在启动过程中,您需要加载.env文件,以便这些环境变量可用:
(new DotEnv())->load(__DIR__ . '/../.env');

您应该在开发、测试和生产环境中计划将秘密密钥放入环境变量中。具体如何操作取决于您的需求。在开发和测试环境中,您可以使用.env文件;而在生产环境中,您可以使用Apache来注入密钥。
个人而言,我总是使用.env文件,并且在存储库中保留一个空白文件。这样做非常简单,而且没有任何特殊情况需要处理。
如果您只想在特定环境中使用.env文件,可以这样做:
if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) {
    (new DotEnv())->load(__DIR__ . '/../.env');
}

2
尽管 getenv('APP_ENV') 需要在本地开发机器上设置 APP_ENV 环境变量,但我建议添加一个默认值 if (!getenv('APP_ENV') || ...) - yceruto
确实,@yceruto。有人必须设置一个环境变量来加载环境变量。O_o 这也是我无条件使用 env 文件的原因之一。 - bishop
@bishop的意思是我们需要设置一个环境变量(APP_ENV)才能加载.env文件?我想这就是@yceruto所警告的:/ - user8020553

5

对于测试环境,我建议创建一个 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接