如何将实际的 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 4,
- PHP 7.2
- 在 Mac OS 和 Windows 7 上进行了测试。
- ENV 变量加载正确。 print_r($_ENV) 显示了这个。
您在错误的地方调试您的应用程序。这是正常的 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']);
我正在尝试制作一个 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 4,
- PHP 7.2
- 在 Mac OS 和 Windows 7 上进行了测试。
- ENV 变量加载正确。 print_r($_ENV) 显示了这个。
您在错误的地方调试您的应用程序。这是正常的 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']);