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

Posted

技术标签:

【中文标题】如何在 Symfony4 结构的参数文件中检索我的环境变量?【英文标题】:How can I retrieve my environment variables in a parameter file in Symfony4 structure? 【发布时间】:2018-02-03 22:09:54 【问题描述】:

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

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

我在config/packages/hwi_oauth.yaml 文件中声明我的consumer_idconsumer_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。

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

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

【问题讨论】:

您是否正在使用DotEnv 组件加载.env 谢谢@bishop! public\index.php 包含 if (!getenv('APP_ENV')) (new Dotenv())->load(__DIR__.'/../.env'); 并且此 .env 未加载。它现在有效!但检查是为了确保我们不在生产中使用.env。我不明白如何在开发中使用它并且仍然保护我的产品......它是否可以通过这个来代替测试!getenv('APP_ENV')in_array(getenv('APP_ENV'), ['dev','test']) 【参考方案1】:

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

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

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

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

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

if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) 
    (new DotEnv())->load(__DIR__ . '/../.env');

【讨论】:

+1 即使getenv('APP_ENV') 需要在本地开发机器中设置APP_ENV 环境变量。我建议也添加默认的if (!getenv('APP_ENV') || ...) 确实,@yceruto。必须设置一个环境变量来加载环境变量。 O_o 我无条件使用 env 文件的部分原因。 @bishop 这意味着我们需要设置一个环境变量(APP_ENV)才能加载.env 文件?我认为这就是@yceruto 的警告:/【参考方案2】:

对于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>

【讨论】:

以上是关于如何在 Symfony4 结构的参数文件中检索我的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Symfony4中配置bundle?

如何从 Dock 中的程序快捷方式中检索命令行参数?

Symfony4如何使用查询构建器获取对象

symfony 4:如何从 RootDir 获取“/public”

如何在 Java 中检索外部 .properties 文件?

Symfony4加载类自定义文件夹时出错“预计找到类...但是找不到它”