在运行时使用 env() 在 Symfony 3.2 中加载外部环境参数 return 未解析的值
Load external environment parameters in Symfony 3.2 using env() at runtime return unresolved values
我在使用 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()
它 return 我的价值观是这样的:
env_VAL1_3ec776edc429c1734ed780a29a0af538 , env_VAL2_3ec776edc429c1734ed780a29a0af538
我认为容器无法从环境中解析这些值。
注意:我使用设置环境变量:
$ export VAL1='SOME TEXT'
有人知道为什么吗?
请尝试:
parameters:
database:
driver: pdo_mysql
host: 127.0.0.1
dbname: dbname
user: '%env(VAL1)%'
password: '%env(VAL2)%'
log_path: /logs
我认为这就是问题所在。请参阅此文档以供参考:
http://symfony.com/doc/current/configuration/external_parameters.html
所以我花了一些时间调查这个 'issue' 这是我发现的...
使 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()
怎么了?
如果你使用 Symfony\Bundle\FrameworkBundle\Test\WebTestCase 而不是 \PHPUnit_Framework_TestCase Symfony3 为你施展魔法。
$client = static::createClient();
$this->container = $client->getContainer();
$user = $container->getParameter('user'); // $user = 'abc'
看看
http://symfony.com/doc/current/testing.html#your-first-functional-test
通过这种方法,您还可以使用 *_test.yml 特定文件调整 Symfony 配置。
我认为这是正确的方法。
我在使用 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()
它 return 我的价值观是这样的:
env_VAL1_3ec776edc429c1734ed780a29a0af538 , env_VAL2_3ec776edc429c1734ed780a29a0af538
我认为容器无法从环境中解析这些值。
注意:我使用设置环境变量:
$ export VAL1='SOME TEXT'
有人知道为什么吗?
请尝试:
parameters:
database:
driver: pdo_mysql
host: 127.0.0.1
dbname: dbname
user: '%env(VAL1)%'
password: '%env(VAL2)%'
log_path: /logs
我认为这就是问题所在。请参阅此文档以供参考: http://symfony.com/doc/current/configuration/external_parameters.html
所以我花了一些时间调查这个 'issue' 这是我发现的...
使 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()
怎么了?
如果你使用 Symfony\Bundle\FrameworkBundle\Test\WebTestCase 而不是 \PHPUnit_Framework_TestCase Symfony3 为你施展魔法。
$client = static::createClient();
$this->container = $client->getContainer();
$user = $container->getParameter('user'); // $user = 'abc'
看看 http://symfony.com/doc/current/testing.html#your-first-functional-test
通过这种方法,您还可以使用 *_test.yml 特定文件调整 Symfony 配置。
我认为这是正确的方法。