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

Ale*_*ant 9 php environment-variables symfony symfony-flex symfony4

我使用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
Run Code Online (Sandbox Code Playgroud)

我的申请工作正常.但我无法在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%'
Run Code Online (Sandbox Code Playgroud)

我阅读了有关新DotEnv包的Symfony4最佳实践.

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

正如最佳实践中所建议的那样,我将这两行附加到.env文件:

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX
Run Code Online (Sandbox Code Playgroud)

但是我遇到了这个错误:

您已请求不存在的参数"twitter_consumer_id".

我试着用%kernel.twitter_consumer_id%,%env.twitter_consumer_id%,%env(TWITTER_CONSUMER_ID)%没有更多的成功.

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

在渲染模板期间抛出了异常("未找到环境变量:"TWITTER_CONSUMER_ID".").

如何在参数文件中检索我的ENV变量hwi_oauth.yaml?

bis*_*hop 8

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

(new DotEnv())->load(__DIR__ . '/../.env');
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • +1即使`getenv('APP_ENV')`需要在本地开发机器中设置`APP_ENV` env var.我建议添加默认值`if(!getenv('APP_ENV')|| ...)`. (2认同)

yce*_*uto 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' => '...'
    // ...
]);
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)