如何从其他容器项访问动态引用?

时间:2015-02-12 13:46:58

标签: php symfony dependency-injection symfony-components

如何将动态依赖项从一个已注册的容器定义传递到另一个?在这种情况下,通用Database对象希望从通用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. 解析config yaml文件并创建特定于环境的版本
  3. 通过调用getEnvironmentConfig
  4. 返回此信息

    这可能吗?

1 个答案:

答案 0 :(得分:0)

使用Expression Language Component

解决了这个问题

因此,您可以轻松地链接方法调用,例如:

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