10

我使用 Symfony Flex 进行了全新的 Symfony 安装,新的骨架属于下一个 Symfony 4 目录结构。

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

我在文件中声明了 myconsumer_id和 my 。consumer_secretconfig/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 最佳实践。

使用环境变量虽然远非完美,但与我们目前所做的相比有很多好处。环境变量是管理依赖于环境的设置的一种更“标准”的方式(例如,不需要管理 parameters.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”。”)。

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

4

2 回答 2

8

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

(new DotEnv())->load(__DIR__ . '/../.env');

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

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

如果您只想.env在特定环境中使用文件,您可以这样做:

if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) {
    (new DotEnv())->load(__DIR__ . '/../.env');
}
于 2017-08-25T20:25:35.887 回答
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>
于 2017-08-25T21:01:56.687 回答