0

我一直在查找 symfony 是如何进行依赖注入的。但我不明白它的直接目的。

它似乎将一切都称为服务。服务是类似于配置的路由器的东西。这些服务中的大多数都有启动所需的设置变量的基线。但是有一种方法叫做“isShared”。

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

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

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 的对象怎么办?

4

1 回答 1

0

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

这时候配置启动不是在每个类的内部是非常有用的,而是将它(在这种情况下)写入 services.xml / services.yml

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

对于你的另一个问题:

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

您可以在构造函数中传递参数,您可以在另一个函数中传递它们。当您确实需要多次参数但又想要灵活的另一种解决方案时,您也可以在父服务的双方(DI 和类)文档中使用继承

但首先,我建议你阅读这个mailer例子,这真的很简单:http ://symfony.com/doc/current/components/dependency_injection/introduction.html 然后你可以继续下一页关于不同类型的注入, ETC。

于 2013-04-25T21:52:12.823 回答