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

mil*_*osa 6 php environment-variables symfony symfony4

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

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

bundle_name:
    config_value: "%env(NAME_OF_ENV_VALUE)%"
Run Code Online (Sandbox Code Playgroud)

我的 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);
}
Run Code Online (Sandbox Code Playgroud)

结果print_r($config)如下:

 [config_value] => env_NAME_OF_ENV_VALUE_2ae7ade5b0635007828f2e7e6765cd4d
Run Code Online (Sandbox Code Playgroud)

另外,我收到此异常:

环境参数异常

从不使用环境变量“ENV_VAR_NAME”。请检查您的容器的配置。在 PhpDumper.php 中(第 271 行)

现在,我的问题是

我如何(结果是ENV 占位符)转换为 ENV 变量的实际值?

我尝试过的一些事情

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

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

一些附加信息

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

Cer*_*rad 3

@PavelAlazankin 差一点就成功了。环境值的实际评估确实要推迟到以后。

要克服“从未使用过”的错误消息,您需要在某个地方实际使用它。我认为这是一种防止拼写错误的保护措施。最简单的方法就是从中创建一个参数。

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']);
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它会是这样的:

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']);
Run Code Online (Sandbox Code Playgroud)