【发布时间】:2022-01-25 15:20:38
【问题描述】:
最近我决定在其中一个项目中使用 Symfony 5.4 容器来提供一些全面的 DI。它像往常一样运行良好,直到我尝试在 services.yaml::parameters 部分使用一些环境变量。
文档声明我应该绑定到一个环境变量
# services.yaml
parameters:
my_var: '%env(SOME_ENV_VAR)%'
它将在第一次调用时从环境变量中解决。好的。我这样做了,我得到了什么:
echo $container->getParameter('my_var');
// env_b057c2b619f37f36_SOME_ENV_VAR_222ed306d0932595cbdeada438ccbb2a
我确实在$_SERVER 和$_ENV 中看到了SOME_ENV_VAR。我还尝试了Dotenv 组件,以确保我没有遗漏任何东西,但徒劳无功。任何环境变量都会变成这种env_{hash}_{VAR_NAME}_{hash} 模式。
我没有使用完整的 Symfony 安装,只是一些备用组件。我错过了什么?我应该在容器构建阶段手动填充每个环境变量吗?
容器实例化如下:
// $_ENV and $_SERVER already contain `SOME_ENV_VAR` here
require_once __DIR__ . '/vendor/autoload.php';
// `use` statements go here
$containerBuilder = new ContainerBuilder();
$loader = new YamlFileLoader(
$containerBuilder,
new FileLocator(implode(DIRECTORY_SEPARATOR, [__DIR__, 'config']))
);
$loader->load('services.yaml');
$containerBuilder->compile();
$container = $containerBuilder;
$my_var = $container->getParameter('SOME_ENV_VAR');
echo $my_var;
【问题讨论】:
-
PHP 运行时不会自动读取环境变量。您可以通过简单的 var_dump($_ENV); 来确认这一点。设置值由您决定。在编译容器之前添加
putenv('SOME_ENV_VAR','value');,错误应该会消失。您还应该能够使用 Dotenv 组件从 .env 文件中读取变量。可能想重新审视您尝试过的内容。 -
@yivi 我同意,我尝试将该参数作为 arg 传递给服务,并且值是相同的。我在
->compile()之后使用容器。 -
好的,我仍然需要查看更多内容才能知道发生了什么。上述代码和配置不足以可靠地重现问题并为您提供解决方案。
-
@Cerad Env 变量完好无损。它们确实存在于系统环境中,正如我之前在我的问题中所说的,我确实在容器编译前后看到了
$_ENV和$_SERVER两者,这就是我想知道的原因。
标签: php symfony dependency-injection symfony5