Как передать динамическую зависимость из одного зарегистрированного определения контейнера в другое? В этом случае универсальный объект базы данных хочет наследовать от универсального объекта 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 заставить контейнер:
Это возможно?
Это было решено с помощью Компонент языка выражений
Таким образом, вы можете легко связывать вызовы методов, например:
use Symfony\Component\ExpressionLanguage\Expression;
$container->register('database', 'Database')
->addArgument(new Expression('service("config").getEnvironmentConfig("Database", "db.username")'));
Других решений пока нет …