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

时间:2017-08-25 19:49:24

标签: php symfony environment-variables symfony4 symfony-flex

我使用Symfony Flex进行了全新的Symfony安装,新的骨架属于下一个Symfony 4目录结构。

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

我在consumer_id文件中声明了我的consumer_secretconfig/packages/hwi_oauth.yaml

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

  

使用环境变量虽然远非完美,但与我们目前的工作相比有很多好处。环境变量是一个更多的标准"管理依赖于环境的设置的方法(例如,无需管理参数.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变量?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

如果您只想在特定环境中使用.env文件,则可以执行以下操作:

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

答案 1 :(得分:5)

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

测试/ 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>