Как я могу получить переменные среды в файле параметров в структуре Symfony4?
Я сделал новую установку Symfony с помощью Symfony Flex, и новый скелет принадлежит следующей структуре каталогов 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
Мое приложение работает нормально. Но я не могу раскрывать свои секреты на 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%'
Я прочитал Рекомендации Symfony4 о новом пакете Dotenv.
Использование переменных среды, хотя и далеко не идеально, имеет много преимуществ по сравнению с тем, что мы делаем в настоящее время. Переменные среды являются более "стандартным" способом управления настройками, которые зависят от среды (например, нет необходимости управлять параметром.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
?
2 answers
Вам необходимо загрузить файл .env
во время процесса начальной загрузки, чтобы эти переменные среды были доступны:
(new DotEnv())->load(__DIR__ . '/../.env');
Вы должны планировать размещение секретных ключей в переменных среды при разработке, постановке и производстве. Однако это зависит от того, как вы это сделаете. При разработке и постановке, возможно, вы используете файлы .env
, в то время как в производстве вы используете Apache для внедрения.
Лично я всегда использую файлы .env
, и я храню пустой файл в своем репозитории. Этот путь его очень просто развернуть, и нет никаких особых случаев.
Если вы хотите использовать файлы .env
только в определенных средах, вы можете сделать:
if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) {
(new DotEnv())->load(__DIR__ . '/../.env');
}
Для test
сред я бы также предложил создать сценарий bootstrap.php
для переопределения параметров .env
:
Tests/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>