我在使用symfony 3.2 console,config和YAML组件的应用程序中有一个参数文件,我尝试在Service Container参数中设置external Parameters from environment变量.
我创建容器构建器.
$container = new ContainerBuilder();
我使用文件定位器来定位资源:
$container = new ContainerBuilder();
加载器解析器加载资源
LoaderResolver();
并使用加载方法:
$this->load('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 VAL1=abc
$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()有什么问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。