Как мне загрузить фактические значения переменных ENV в конфигурацию моего пакета?

Я пытаюсь создать пакет Symfony. Но я не могу прочитать переменные ENV, которые я использую в конфигурации. (Они загружаются только как заполнитель). Я создал дерево конфигурации с некоторыми значениями, которые я бы хотел, чтобы приложение использовало с переменными ENV.

Конфигурационный файл приложения выглядит так:

bundle_name:
    config_value: "%env(NAME_OF_ENV_VALUE)%"

Класс расширения My Bundle выглядит так:

public function load(array $configs, ContainerBuilder $container): void
{
    $loader = new XmlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );

    $configuration = new Configuration();
    $loader->load('services.xml');
    $config = $this->processConfiguration($configuration, $configs);

    print_r($config);
}

Результат print_r($config) выглядит так:

 [config_value] => env_NAME_OF_ENV_VALUE_2ae7ade5b0635007828f2e7e6765cd4d

Кроме того, я получаю это исключение:

EnvParameterException

Переменные среды "ENV_VAR_NAME" никогда не используются. Пожалуйста, проверьте конфигурацию вашего контейнера. в PhpDumper.php (строка 271)

Теперь мой вопрос:

Как мне (что оказывается заполнителем ENV) узнать фактическое значение переменной ENV?

Что я пробовал

Я знаю, что есть опция ContainerBuilder->compile(true), которая должна разрешать эти переменные ENV. Но я не могу понять, куда мне положить это в свой комплект. Все, что я пробовал, дает ошибки.

Я также знаю, что существует CompilerPass (Symfony \ Component \ DependencyInjection \ Compiler \ ResolveEnvPlaceholderPass), который (согласно названию) должен разрешать переменные env, но это ничего не делает. Я попытался добавить $container->addCompilerPass(new ResolveEnvPlaceholdersPass()); в метод build () моего класса Bundle, но ничего не произошло.

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

  • Я использую Symfony 4,
  • PHP 7.2
  • Проверено как на Mac OS, так и на Windows 7.
  • ENV var загружен правильно. print_r ($ _ ENV) показывает это.

person milosa    schedule 18.04.2018    source источник


Ответы (2)


@PavelAlazankin почти достал. Фактические оценки значений env действительно отложены на потом.

Чтобы избавиться от сообщения об ошибке «никогда не использовалось», вам нужно где-то его использовать. Думаю, это защита от опечаток. Самый простой способ просто сделать из него параметр.

public function load(array $configs, ContainerBuilder $container)
{
    print_r($configs);
    // Makes the not used error go away
    $container->setParameter('config_value',$configs[0]['config_value']);
}

В вашем случае это будет примерно так:

public function load(array $configs, ContainerBuilder $container): void
{
    $loader = new XmlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );

    $configuration = new Configuration();
    $loader->load('services.xml');
    $config = $this->processConfiguration($configuration, $configs);

    $container->setParameter('config_value',$config['config_value']);
person Cerad    schedule 18.04.2018
comment
Наконец-то это работает. Я должен сказать, что я считаю, что никогда не использовавшаяся ошибка очень сбивает с толку, и документы не содержат много информации, относящейся к этому. В любом случае, спасибо! - person milosa; 18.04.2018
comment
Впервые столкнулся с этой ошибкой. Честно ожидал, что у вас опечатка. Что касается документации, не стесняйтесь отправлять запрос на перенос. Простой способ вернуть что-то сообществу. И хорошо смотрится в резюме. - person Cerad; 18.04.2018
comment
Ну, я имел в виду: для меня помещение %env(NAME_OF_ENV_VALUE)% в файл конфигурации IS с использованием значения ENV. Но вместо этого это было причиной ошибки. Вот что меня смущает. И я бы хотел улучшить документацию, но мои знания Symfony даже близко не позволяют это сделать. Может что-нибудь на потом. - person milosa; 19.04.2018

Вы отлаживаете свое приложение не в том месте. Это нормальное поведение Symfony, некоторые динамические параметры лениво загружаются из переменных env по запросу.

Чтобы убедиться, что конфигурация настроена правильно, вы можете получить этот параметр из контейнера (например, в контроллере или где-то еще):

$configValue = $this->getParameter('bundle_name.config_value');

и сбросьте его с помощью dump(), var_dump() или print_r().

Вы можете попробовать отладить метод $ container-> getParameter () с помощью xDebug, чтобы увидеть, что происходит за кулисами внутри автоматически сгенерированного класса контейнера.

person Pavel Alazankin    schedule 18.04.2018
comment
Я пытался сделать то, что ты предлагал. Но что я забыл упомянуть, так это то, что я получил это исключение: EnvParameterException Environment variables "ENV_VAR_NAME" are never used. Please, check your container's configuration. in PhpDumper.php (line 271) Что не позволяет мне даже увидеть результат var_dump в контроллере. - person milosa; 18.04.2018