【问题标题】:Dependency Injection Symfony object creation parameters依赖注入 Symfony 对象创建参数
【发布时间】:2013-04-25 15:40:05
【问题描述】:

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

它似乎将一切都称为服务。服务是类似于配置的路由器的东西。这些服务中的大多数都有启动所需的设置变量的基线。但是有一种方法叫做“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 的对象呢?

【问题讨论】:

  • 依赖注入是一种控制反转的方法。还有许多其他方法可以进行控制反转。至于您的参数,没关系,因为配置通常是从配置文件中读取的,该配置文件在执行应用程序时不会更改(尽管您的问题令人困惑,因为您标记了 SF2 但您的代码看起来像 SF1 )。
  • 我的错,还以为是 SF2。

标签: symfony dependency-injection ioc-container


【解决方案1】:

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

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

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

关于您的其他问题:

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

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

但首先,我建议您阅读本文以mailer 为例,这真的很简单:http://symfony.com/doc/current/components/dependency_injection/introduction.html 然后您可以继续阅读有关不同类型注射等的下一页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多