Как получить доступ к динамическим ссылкам из других элементов контейнера?


Как я могу передать динамическую зависимость от одного зарегистрированного определения контейнера другому? В этом случае универсальный объект базы данных хочет наследовать от универсального объекта конфигурации. Особенность в том, что конфигурация не статична, а загружается в зависимости от заданной переменной среды.

Настройка соответствующих методов

    public function __construct()
    {
        $configFile = 'example.config.yml';
        $yamlParser = new Parser();
        $reader = new Config\Reader($yamlParser);
        $configYaml = $reader->parse(file_get_contents($configFile));
        $config = new Config\Environment(getenv('SITE'), $configYaml);

        $this->config = $config;
    }

    public function getEnvironmentConfig()
    {
        return $this->config;
    }

Регистрация конфигурации так же проста, как

$container->register('config', 'Config');

База данных в настоящее время добавлена в контейнер следующим образом:

$container
    ->register('database', 'Database')
    ->addArgument($config->getEnvironmentConfig('Database', 'db.username'))
    ->addArgument($config->getEnvironmentConfig('Database', 'db.password'))
;

Но я хочу сделать что-то вроде

$container
        ->register('database', 'Database')
        ->addArgument(new Reference('config')->getEnvironmentConfig('Database', 'db.username'))
        ->addArgument(new Reference('config')->getEnvironmentConfig('Database', 'db.password'))
    ;

Переменная $config в PHP делает невозможным переход из конфигурации, построенной на PHP. Я хочу определить службы в yaml, чтобы заставить контейнер:

  1. Создать экземпляр конфигурации
  2. Проанализируйте файл конфигурации yaml и создайте версию для конкретной среды
  3. Верните это при вызове getEnvironmentConfig

Возможно ли это?

Author: John, 2015-02-12

1 answers

Это было решено с помощью компонента языка выражений

Таким образом, вы можете легко связывать вызовы методов, например:

use Symfony\Component\ExpressionLanguage\Expression;
$container->register('database', 'Database')
          ->addArgument(new Expression('service("config").getEnvironmentConfig("Database", "db.username")'));
 0
Author: John, 2015-02-12 15:08:16