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

Author: yceruto, 2017-08-25

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');
}
 7
Author: bishop, 2017-08-25 20:25:35

Для 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>
 6
Author: yceruto, 2017-09-04 16:34:28