Как я могу получить свои переменные окружения в файле параметров в структуре 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.

Использование переменных среды, хотя и далеко не идеальное, имеет много преимуществ по сравнению с тем, что мы делаем в настоящее время. Переменные среды — это более «стандартный» способ управления настройками, которые зависят от среды (например, нет необходимости управлять параметром 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?

9

Решение

Вам нужно загрузить .env файл во время процесса начальной загрузки, чтобы эти переменные среды были доступны:

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

Вы должны планировать помещать секретные ключи в переменные среды при разработке, подготовке и производстве. Однако, как вы это сделаете, зависит. В разработке и постановке, возможно, вы используете .env файлов, в то время как на производстве вы используете Apache для внедрения.

Лично я всегда использую .env файлы, и я храню пустую в моем хранилище. Таким образом, его очень просто развернуть, и особых случаев нет.

Если вы хотите использовать только .env файлы в определенных средах, вы можете сделать:

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

Другие решения

За 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>
5

По вопросам рекламы [email protected]