依赖注入Symfony对象创建参数

时间:2013-04-25 15:40:05

标签: symfony dependency-injection ioc-container

我一直在查找symfony是如何做到的dependency injection。但我不明白它的直接目的。

它似乎将所有内容都称为服务。服务是配置路由器的一部分。这些服务中的大多数都具有启动所需的设定变量的基线。但是有一种叫做'isShared'的方法。

我假设在使用该方法时,它会创建一个新的Object而不是已经创建的Object。

但是当要创建的Object需要一个完全不同的变量时会发生什么?

class foobarClass
{
    public function __construct($config.foo)
    {
        //
    }
}

$container = new sfContainerBuilder(array('config.foo' => 'bar'));

$container->register('foobar','foobarClass')
          ->addArgument('%config.foo%')
          ->isShared(false);

什么是config.foo不应该是bar而是foo?我是否需要为基本上每个可能的配置创建另一个定义(看起来很奇怪并且违背了DIC的目的)?

依赖注入和反向控制之间的主要区别是什么?用什么时间和地点?

提前致谢!

修改

关于参数问题的另一个例子:

class Files
{
    protected $_path;

    public function __construct($path)
    {
        $this->_path = $path;
    }
}

$container = new sfContainerBuilder(array('path.to.something' => '/some/path/file.abc'));

$container->register('files','files')
          ->addArgument('path.to.something')
          ->isShared(false);

如果需要,我该怎么做一条新路?该定义已经有path.to.something。但是如果我需要一个带有path.sto.somethingElse的对象呢?

1 个答案:

答案 0 :(得分:0)

在Symfony2中,服务是普通的类,不需要类继承 目的是你不需要关心启动对象 对于非常小的应用程序,似乎没有必要,但当某些对象之间存在依赖关系时,它可能会成为一个问题。例如:你有4个具有这种关系的对象:
B-需要 - > A,C-需要 - > A,D-需要 - > B& ç

此时配置启动不是在每个类的内部非常有用,而是将它(在本例中)写入services.xml / services.yml

在这种情况下,有时会使用控制反转,它更为通用。但是在这种情况下(依赖注入)也完成了控制反转,因为你处理了对象之外的启动。

关于您的其他问题:

  

什么是config.foo不应该是bar而是foo?

你可以不在构造函数中传递参数,你可以在另一个函数中传递它们。 另一种解决方案,当你真的需要多次论证,但也想要灵活时你也可以使用双方的继承(DI和类)documentaion for Parent Services

但是对于第一个,我建议您使用mailer示例阅读此内容,这非常简单:http://symfony.com/doc/current/components/dependency_injection/introduction.html 然后,您可以继续阅读有关不同类型注射等的下一页。