我正在阅读http://symfony.com/doc/master/components/dependency_injection/introduction.html,然后我更加困惑自己,然后回答问题。我想在我的项目中使用DI,这样我就可以进行适当的测试以及DI带来的所有其他美妙的事情。
才有意义您的代码如何不依赖于容器,这不是您访问容器的方式吗?
假设您有一个带有foo的类和一个带有bar的类
class Bar {
public function bar() { return 'hello world'; }
}
class Foo {
public function __construct(\Bar $bar) { $this->bar = $bar; };
public function foo() { return $this->bar->bar(); }
}
所以你要通过
添加Bar对Foo的依赖use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
$container->register('foo', 'Foo')->addArgument(new Reference('Bar'));
然后你想使用Foo(打印你好世界)你会做类似的事情
class Test {
public function printHello($foo) {
$foo->foo();
}
}
$test = new Test();
$test->printHello($container->get('foo'));
或类似的东西。但该文件似乎说不使用$ container-> get?除非我错了。
答案 0 :(得分:0)
我认为你误解了Avoiding Your Code Becoming Dependent on the Container。它不鼓励你做这样的事情:
class Foo
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function foo()
{
$bar = $this->container->get('bar');
$bar->bar();
}
}
通过这种方式,您的代码将绑定到存在服务bar
的服务容器。
所以,一般来说,只询问你需要什么(bar
),而不要求整个宇宙(service_container
)。
顺便说一下,如果不使用$container->get()
,您仍然可以使用$bar = new Bar(); $foo = new Foo($bar);