我正在尝试创建一个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()方法,但没有任何反应。
其他一些信息
答案 0 :(得分:1)
您在错误的位置调试应用程序。这是正常的symfony行为,一些动态参数是根据需要从env变量延迟加载的。
为确保配置设置正确,您可以从容器中获取此参数(例如在控制器或其他位置):
$configValue = $this->getParameter('bundle_name.config_value');
并将其转储为dump()
或var_dump()
或print_r()
。
您可以尝试使用xDebug调试$ container-> getParameter()方法,以查看自动生成的容器类中幕后发生的情况。
答案 1 :(得分:1)
要超越“从未使用过”的错误消息,您需要在某个地方实际使用它。我认为这是对打字错误的保护。从中获取参数的最简单方法。
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']);