我使用Symfony Flex进行了全新的Symfony安装,新的骨架属于下一个Symfony 4目录结构。
我添加并配置了第一个第三方软件包:HWIOAuthBundle。该捆绑包用于通过Twitter使用两个秘密信息进行连接。
我在consumer_id
文件中声明了我的consumer_secret
和config/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变量?
答案 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>