Так что я провел некоторое время, расследуя эту «проблему» и вот что я узнал ...
Единственный способ получить env(VAL1)
штуку работать, чтобы генерировать контейнер в файл PHP, используя PHPDumper
, а затем используйте созданный контейнер. Нет другого способа заставить его работать, потому что он разрешает только среду в этом файле.
В обычном проекте 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()
?
Вы пытались заменить '%% env (VAL1)%" 'на' env (VAL1) ' –
Да, и он не работает, он показывает мне значение выше. – SMSM