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