4

У меня есть файл параметры в приложении с помощью Symfony 3.2 консоли, конфигурацию и компонент YAML, и я пытаюсь установить external Parameters from environment переменные в Параметры сервисного контейнера.нагрузки внешних параметров окружающей среды в Symfony 3.2 с использованием окр() при возврате выполнения неразрешенного значение

Я создаю контейнерный строитель.

$container = new ContainerBuilder(); 

Am используя файл локатор для поиска ресурсов:

$container = new ContainerBuilder(); 

Погрузчик распознаватель для загрузки ресурсов

LoaderResolver(); 

И используя метод загрузки:

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

парам eters.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' 

Каждый имеет представление о том, почему?

+0

Вы пытались заменить '%% env (VAL1)%" 'на' env (VAL1) ' –

+0

Да, и он не работает, он показывает мне значение выше. – SMSM

ответ

6

Так что я провел некоторое время, расследуя эту «проблему» и вот что я узнал ...

Единственный способ получить 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()?

+0

Благодарим вас за ответ, в настоящее время я не выполняю кэширование в своем приложении, и я хочу использовать его без добавления поддержки кеша в своем приложении. Вы поделились очень полезной информацией, и я попробую ваш код и попробую предоставить вам свои отзывы. – SMSM

+1

Не могли бы вы отметить ответ, как принято. – Stepashka

1

Пожалуйста, попробуйте:

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

+0

Точно, что я имею в виду. Он должен работать нормально :) –

+0

Я меняю параметры, но ничего не происходит. – SMSM

+0

Я думаю, что проблема связана с видом расширения контейнера или компиляции – SMSM

-1

Если вы используете 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

С помощью этого метода вы будете в состоянии настроить также конфигурации Symfony, используя * _test.yml определенные файлы.

Я думаю, что это правильный путь.

 Смежные вопросы

  • Нет связанных вопросов^_^