首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Symfony4结构的参数文件中检索环境变量?

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

Stack Overflow用户
提问于 2017-08-25 19:49:23
回答 2查看 2.8K关注 0票数 9

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

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

我在consumer_id文件中声明了我的consumer_secretconsumer_secret

代码语言:javascript
代码运行次数:0
运行
复制
hwi_oauth:
    firewall_names: [secured_area]
    resource_owners:
        twitter:
            type:          twitter
            client_id:     XXXXXMyIdXXXXX
            client_secret: XXXXXMyTopSecretKeyXXXXX

我的应用程序工作得很好。但是我不能在github上泄露我的秘密!

我想要一个像这样的hwi_oauth.yaml文件:

代码语言:javascript
代码运行次数:0
运行
复制
hwi_oauth:
    firewall_names: [secured_area]
    resource_owners:
        twitter:
            type:          twitter
            client_id:     '%twitter_consumer_id%'
            client_secret: '%twitter_consumer_secret%'

我读过关于新的Symfony4最佳实践包的DotEnv。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-25 20:25:35

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

代码语言:javascript
代码运行次数:0
运行
复制
(new DotEnv())->load(__DIR__ . '/../.env');

您应该计划将环境变量中的秘密密钥放在开发、暂存和生产中。不过,这要看你怎么做了。在开发和暂存过程中,您可能使用.env文件,而在生产中则使用Apache进行注入。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) {
    (new DotEnv())->load(__DIR__ . '/../.env');
}
票数 8
EN

Stack Overflow用户

发布于 2017-08-25 21:01:56

对于test环境,我建议还创建一个bootstrap.php脚本来覆盖.env参数:

tests/bootstrap.php:

代码语言:javascript
代码运行次数:0
运行
复制
<?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:

代码语言:javascript
代码运行次数:0
运行
复制
<?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>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45888507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档