Как заставить Symfony читать переменные env из другого файла, кроме .env? - PullRequest
0 голосов
/ 29 марта 2019

Symfony не читает переменные окружения из config / параметров, даже если они существуют в среде работающего контейнера Docker.

Symfony продолжает жаловаться, если конкретно файл .env не используется.

Как заставить Symfony прочитать саму среду или файл с именем, отличным от .env?

Дополнительная информация:

Проблема возникает в ./symfony/dependency-injection / EnvVarProcessor.php: 96 при попытке загрузить файлы из config/packages/doctrine.yaml для использования в Doctrine ORM.

1 Ответ

1 голос
/ 29 марта 2019

1 . Чтение env-переменной из docker env-переменной

Как вы знаете, Symfony может читать переменные env только с префиксом SYMFONY __

В DockerFile:

ENV SYMFONY__MY_ENV_VAR myvalue // here  it's not forced to prefix it by SYMFONY__

В файле apache conf, где вы настраиваете свой виртуальный хост, например:

 SetEnv SYMFONY__MY_ENV_VAR ${SYMFONY__MY_ENV_VAR} // ${SYMFONY__MY_ENV_VAR} refer to the previous variable declared in docker file 

у вас параметры.имль

  parameters: 
     my_env_value: '%my.env_var%'

Symfony заменит точку с двумя подчеркиваниями, чтобы найти env var без ключевого слова symfony __ .

Пример:

SYMFONY__MY_ENV_VAR  ==> %my_env_var%

Так что в вашем приложении вам нужно просто вставить контейнер, чтобы получить параметр следующим образом:

$this->container->getParameter('my_env_value');

2. Переопределить файл .env другим именем файла

Суть в том, чтобы изменить файл bootstrap.php, который выглядит следующим образом:

<?php
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.php';
// Load cached env vars if the .env.local.php file exists
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
    $_SERVER += $env;
    $_ENV += $env;
} elseif (!class_exists(Dotenv::class)) {
    throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
} else {
    // load all the .env files
    (new Dotenv())->loadEnv(dirname(__DIR__).'/.env'); // just make the file name that you want instead of .env
}
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...