0

我正在阅读http://symfony.com/doc/master/components/dependency_injection/introduction.html,结果我比回答问题更让自己困惑。我想在我的项目中使用 DI,这样我就可以进行适当的测试以及 DI 附带的所有其他美妙的事情。

但是我正在阅读这篇文章,直到http://symfony.com/doc/master/components/dependency_injection/introduction.html#avoiding-your-code-becoming-dependent-on-the-container

你的代码怎么能不依赖容器,这不就是你访问它的方式吗?

假设您有一个带有 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 (print hello world) 你会做类似的事情

class Test {
    public function printHello($foo) {
        $foo->foo();
    }
}

$test = new Test();
$test->printHello($container->get('foo'));

或类似的东西。但是那个文件好像说不要用$container->get?除非我错了。

4

1 回答 1

0

我认为您误解了避免您的代码依赖于 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);

于 2013-06-06T18:00:41.053 回答