Php 如何在Symfony4结构的参数文件中检索环境变量?
我使用symfonyflex进行了新的Symfony安装,新的框架属于下一个symfony4目录结构 我添加并配置第一个第三方捆绑包:。此捆绑包用于使用两个秘密信息通过Twitter进行连接 我在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
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>