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

Php 如何在Symfony4结构的参数文件中检索环境变量?,php,symfony,environment-variables,symfony4,symfony-flex,Php,Symfony,Environment Variables,Symfony4,Symfony Flex,我使用symfonyflex进行了新的Symfony安装,新的框架属于下一个symfony4目录结构 我添加并配置第一个第三方捆绑包:。此捆绑包用于使用两个秘密信息通过Twitter进行连接 我在config/packages/hwi\u oauth.yaml文件中声明我的consumer\u id和我的consumer\u secret hwi_oauth: firewall_names: [secured_area] resource_owners: twit

我使用symfonyflex进行了新的Symfony安装,新的框架属于下一个symfony4目录结构

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

我在
config/packages/hwi\u oauth.yaml
文件中声明我的
consumer\u id
和我的
consumer\u 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包的文章

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

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

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX
但我遇到了这个错误:

您请求了一个不存在的参数“twitter\u consumer\u id”

我尝试了
%kernel.twitter\u consumer\u id%
%env.twitter\u consumer\u id%
%env(twitter\u consumer\u id)%
,但没有成功

最后一个测试返回此错误消息:

在呈现模板期间引发了异常(“未找到环境变量:“TWITTER\u CONSUMER\u ID”。”


如何在参数文件(如
hwi_oauth.yaml
)中检索环境变量?

您需要在引导过程中加载
.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' => '...'
    // ...
]);

您正在加载带有
DotEnv
组件的
.env
吗?谢谢@bishop!
public\index.php
包含
if(!getenv('APP_ENV')){(new Dotenv())->load(uu DIR_u./...ENV');}
且未加载此
.ENV
。现在可以了!但检查是为了确保我们在生产中不使用
.env
。我不知道如何在开发中使用它,并且仍然保护我的产品。。。重新进行测试是否安全
!getenv('APP_ENV')
通过此命令:
在数组中(getenv('APP_ENV'),['dev','test'])
?+1,即使
getenv('APP_ENV')
需要在本地开发机器中设置
APP_ENV
ENV变量。如果(!getenv('APP_ENV')| | |…)
,我建议也添加默认的
。必须设置环境变量以加载环境变量的人。O_O我无条件使用env文件的部分原因。@这意味着我们需要设置一个环境变量(
APP_env
)才能加载
.env
文件?这就是@yceruto所警告的,我认为:/
<?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>