Я сделал новую установку 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
?
Вам нужно загрузить .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>