Как получить переменные среды в файле параметров в структуре Symfony4?

я сделал новую установку Symfony, используя Symfony Flex, и новый скелет принадлежит следующей структуре каталогов Symfony 4.

я добавляю и настраиваю первый сторонний пакет:HWIOAuthBundle. Этот пакет используется для подключения через Twitter с использованием двух секретных данных.

мои consumer_id и меня consumer_secret на .

hwi_oauth:
    firewall_names: [secured_area]
    resource_owners:
        twitter:
            type:          twitter
            client_id:     XXXXXMyIdXXXXX
            client_secret: XXXXXMyTopSecretKeyXXXXX

мое приложение работает нормально. Но я не могу доверить свои секреты. на GitHub!

я хочу вот так:

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 для экземпляр.)

как предложено в лучших практиках, я добавляю эти две строки в :

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 ответов


вам нужно загрузить .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 параметры:

тесты / 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>