我一直在查找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的对象呢?
答案 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
然后,您可以继续阅读有关不同类型注射等的下一页。