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

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

Конфиг соответствующие методы

    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 in-PHP делает невозможной миграцию из PHP-конфигурации. Я хочу определить службы в yaml заставить контейнер:

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

Это возможно?

2

Решение

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

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

use Symfony\Component\ExpressionLanguage\Expression;
$container->register('database', 'Database')
->addArgument(new Expression('service("config").getEnvironmentConfig("Database", "db.username")'));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]