如何将实际的ENV var值加载到我的bundle配置中?

时间:2018-04-18 08:14:56

标签: php symfony environment-variables symfony4

我正在尝试创建一个Symfony包。但是我无法读取我在配置中使用的ENV变量。 (它们仅作为占位符加载) 我创建了一个配置树,其中包含一些值,我喜欢与ENV vars一起使用的应用程序。

应用程序配置文件如下所示:

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 var的实际值?

我试过的一些事情

我知道有一个ContainerBuilder->compile(true)选项,可以解析这些ENV变量。但我无法弄清楚我应该把它放在我的捆绑中。我试过的一切都给出了错误。

我也知道有一个CompilerPass(Symfony \ Component \ DependencyInjection \ Compiler \ ResolveEnvPlaceholdersPass),它(根据名称)应该解析env vars,但这并没有做任何事情。我尝试将$container->addCompilerPass(new ResolveEnvPlaceholdersPass());添加到我的Bundle类' build()方法,但没有任何反应。

其他一些信息

  • 我正在使用Symfony 4,
  • PHP 7.2
  • 在Mac OS和Windows 7上对此进行了测试。
  • 正确加载ENV var。 print_r($ _ ENV)显示了这一点。

2 个答案:

答案 0 :(得分:1)

您在错误的位置调试应用程序。这是正常的symfony行为,一些动态参数是根据需要从env变量延迟加载的。

为确保配置设置正确,您可以从容器中获取此参数(例如在控制器或其他位置):

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

并将其转储为dump()var_dump()print_r()

您可以尝试使用xDebug调试$ container-> getParameter()方法,以查看自动生成的容器类中幕后发生的情况。

答案 1 :(得分:1)

@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']);
相关问题