如何在 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_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。
使用环境变量虽然远非完美,但与我们目前所做的相比有很多好处。环境变量是一种更“标准”的方式来管理依赖于环境的设置(例如,不需要管理 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 结构的参数文件中检索我的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
symfony 4:如何从 RootDir 获取“/public”