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

How do I load actual ENV var values into my bundle config?

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

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

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

我的 Bundle 扩展 class 看起来像:

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

Environment variables "ENV_VAR_NAME" are never used. Please, check your container's configuration. in PhpDumper.php (line 271)

现在,我的问题是

如何(原来是 ENV 占位符)输入 ENV 变量的实际值?

我试过的一些东西

我知道有一个 ContainerBuilder->compile(true) 选项,它应该可以解析这些 ENV 变量。但我不知道我应该把它放在我的包裹里的什么地方。我尝试的一切都出错了。

我也知道有一个 CompilerPass (Symfony\Component\DependencyInjection\Compiler\ResolveEnvPlaceholdersPass),它(根据名称)应该解析环境变量,但这没有任何作用。我尝试将 $container->addCompilerPass(new ResolveEnvPlaceholdersPass()); 添加到我的 Bundle class' build() 方法中,但没有任何反应。

一些附加信息

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

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

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

并用 dump()var_dump()print_r() 转储它。

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

@PavelAlazankin 几乎成功了。 env 值的实际评估确实推迟到以后。

要克服 "never used" 错误消息,您需要在某个地方实际使用它。我认为这是一种防止错别字的保护措施。最简单的方法就是用它来制作一个参数。

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']);