如何在 Symfony4 结构的参数文件中检索我的环境变量?
How can I retrieve my environment variables in a parameter file in Symfony4 structure?
我使用 Symfony Flex 重新安装了 Symfony,新框架属于下一个 Symfony 4 目录结构。
我添加并配置了第一个第三方包:HWIOAuthBundle。此捆绑包用于使用两个秘密信息通过 Twitter 进行连接。
我在 config/packages/hwi_oauth.yaml
文件中声明了我的 consumer_id
和 consumer_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 包的 Symfony4 best practices。
Using environment variables, while far from being perfect, have many benefits over what we currently do. Environment variables are a more "standard" way of managing settings that depend on the environment (no need to manage a parameters.yml.dist for instance).
按照最佳实践的建议,我将这两行附加到 .env
文件:
TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX
但是我遇到了这个错误:
You have requested a non-existent parameter "twitter_consumer_id".
我试过 %kernel.twitter_consumer_id%
, %env.twitter_consumer_id%
, %env(TWITTER_CONSUMER_ID)%
都没有成功。
上次测试返回此错误消息:
An exception has been thrown during the rendering of a template ("Environment variable not found: "TWITTER_CONSUMER_ID".").
如何在 hwi_oauth.yaml
这样的参数文件中检索我的 ENV 变量?
您需要在 bootstrap 过程中加载 .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' => '...'
// ...
]);
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>
我使用 Symfony Flex 重新安装了 Symfony,新框架属于下一个 Symfony 4 目录结构。
我添加并配置了第一个第三方包:HWIOAuthBundle。此捆绑包用于使用两个秘密信息通过 Twitter 进行连接。
我在 config/packages/hwi_oauth.yaml
文件中声明了我的 consumer_id
和 consumer_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 包的 Symfony4 best practices。
Using environment variables, while far from being perfect, have many benefits over what we currently do. Environment variables are a more "standard" way of managing settings that depend on the environment (no need to manage a parameters.yml.dist for instance).
按照最佳实践的建议,我将这两行附加到 .env
文件:
TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX
但是我遇到了这个错误:
You have requested a non-existent parameter "twitter_consumer_id".
我试过 %kernel.twitter_consumer_id%
, %env.twitter_consumer_id%
, %env(TWITTER_CONSUMER_ID)%
都没有成功。
上次测试返回此错误消息:
An exception has been thrown during the rendering of a template ("Environment variable not found: "TWITTER_CONSUMER_ID".").
如何在 hwi_oauth.yaml
这样的参数文件中检索我的 ENV 变量?
您需要在 bootstrap 过程中加载 .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' => '...'
// ...
]);
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>