gpt4 book ai didi

php - 在运行时使用 env() 在 Symfony 3.2 中加载外部环境参数返回未解析的值

转载 作者:可可西里 更新时间:2023-10-31 22:40:35 26 4
gpt4 key购买 nike

我在使用 symfony 3.2 控制台、配置和 YAML 组件 的应用程序中有一个参数文件,我尝试设置 external Parameters from environment服务容器参数中的变量。

我创建容器构建器。

$container = new ContainerBuilder();

正在使用文件定位器来定位资源:

$container = new ContainerBuilder();

加载资源的加载器解析器

LoaderResolver();

并使用加载方法:

$this->load('parameters.yml');

parameters.yml 文件:

parameters:
database:
driver: pdo_mysql
host: 127.0.0.1
dbname: dbname
user: env(VAL1)
password: env(VAL2)
Local: us-en

编译容器并尝试检查从参数包中获取值:

$container->getParameterBag()->all()

它返回的值是这样的:

env_VAL1_3ec776edc429c1734ed780a29a0af538 , env_VAL2_3ec776edc429c1734ed780a29a0af538

我认为容器无法从环境中解析这些值。

注意:我使用以下方式设置环境变量:

$ export VAL1='SOME TEXT'

有人知道为什么吗?

最佳答案

所以我花了一些时间调查这个“问题”,这是我发现的...

env(VAL1) 正常工作的唯一方法是使用 PHPDumper 将容器生成到 PHP 文件,然后使用生成的容器。没有其他方法可以让它工作,因为它只能解析该文件中的环境。

在正常的 Symfony 项目中,有一个生成的 var/cache/dev/appDevDebugProjectContainer.php 文件。方法 getDynamicParameter 看起来像这样

 private function getDynamicParameter($name)
{
switch ($name) {
case 'kernel.root_dir': $value = ($this->targetDirs[3].'/app'); break;
case 'kernel.logs_dir': $value = ($this->targetDirs[2].'/logs'); break;
case 'user': $value = $this->getEnv('VAL1'); break;
case 'session.save_path': $value = ($this->targetDirs[3].'/app/../var/sessions/dev'); break;
case 'router.resource': $value = ($this->targetDirs[3].'/app/config/routing_dev.yml'); break;
default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%s" must be defined.', $name));
}
$this->loadedDynamicParameters[$name] = true;

return $this->dynamicParameters[$name] = $value;
}

它是唯一评估 env(VAL1) 的地方。

因此对于您的情况,解决方案如下。

我使用了简化的parameters.yml:

parameters:
user: '%env(VAL1)%'

我做的export:

export VAL1=abc

PHP代码:

$container = new ContainerBuilder();

$loader = new YamlFileLoader(
$container,
new FileLocator('.')
);

$loader->load('parameters.yml');

$container->compile();

$dumper = new PhpDumper($container);

$content = $dumper->dump(
[
'class' => 'DumpedContainer',
'base_class' => 'Container',
'file' => 'DumpedContainer.php',
'debug' => true
]
);

// Use this code if you want to write file to the disk
$cache = new ConfigCache('DumpedContainer.php', true);
$cache->write($content, $container->getResources());
require_once $cache->getPath();

// ... otherwise use this code
//$content = str_replace('<?php', '', $content);
//eval($content);

$container = new DumpedContainer();

$user = $container->getParameter('user'); // $user = 'abc'

在生成的代码中,您将看到以下神奇的方法

private function getDynamicParameter($name)
{
switch ($name) {
case 'user': $value = $this->getEnv('VAL1'); break;
default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%s" must be defined.', $name));
}
$this->loadedDynamicParameters[$name] = true;

return $this->dynamicParameters[$name] = $value;
}

这个解决方案工作正常,但看着它我想知道你的项目是否真的需要这个? getenv() 有什么问题?

关于php - 在运行时使用 env() 在 Symfony 3.2 中加载外部环境参数返回未解析的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41338029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com