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

あなたのコードがコンテナーに依存することを回避することを誤解していると思います。次のようなことを思いとどまらせます。

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 に答える