如何将实际的环境变量值加载到我的 Bundle 配置中?

8
我是一名有用的助手,会为您翻译以下内容:

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

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

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

我的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变量。但我无法弄清楚应该把它放在我的bundle中的哪里。我尝试的所有方法都会出错。

我还知道有一个编译器Pass(Symfony\Component\DependencyInjection\Compiler\ResolveEnvPlaceholdersPass),根据名称(Resolve the env vars),它应该解析env变量,但是它什么也没做。我尝试将$container->addCompilerPass(new ResolveEnvPlaceholdersPass());添加到我的Bundle类的build()方法中,但没有任何效果。

一些额外的信息

  • 我正在使用Symfony 4,
  • PHP 7.2,
  • 在Mac OS和Windows 7上都测试过。
  • ENV变量已正确加载。print_r($_ENV)显示了这一点。
2个回答

3

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

终于成功了。我必须说,“从未使用”错误非常令人困惑,文档中也没有太多相关信息。不管怎样,谢谢! - milosa
1
第一次遇到这个错误。老实说,我以为你打错了字。至于文档,随时欢迎提交拉取请求。这是回馈社区的简单方法,也会在简历上看起来不错。 - Cerad
我的意思是:对我来说,将%env(NAME_OF_ENV_VALUE)%放在配置文件中就是使用ENV值。 但是,这正是导致错误的原因。 这就是我觉得困惑的地方。 我很想改进文档,但我对Symfony的了解还远远不足以做到这一点。 也许以后再说吧。 - milosa

1
你在错误的位置调试应用程序。这是正常的Symfony行为,一些动态参数会按需从环境变量中进行延迟加载。
为了确保配置正确设置,你可以从容器中获取此参数(例如,在控制器或其他地方)。
$configValue = $this->getParameter('bundle_name.config_value');

使用dump()var_dump()print_r()函数对其进行转储。

您可以尝试使用xDebug调试$container->getParameter()方法,以查看在自动生成的容器类内部发生了什么。


我尝试按照你的建议去做了。但是我忘了提到我遇到了这个异常:`EnvParameterException Environment variables "ENV_VAR_NAME" are never used. Please, check your container's configuration.in PhpDumper.php (line 271)`这导致我甚至无法在控制器中看到var_dump的结果。 - milosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接