2013-06-06 6 views
0

Je lisais http://symfony.com/doc/master/components/dependency_injection/introduction.html et j'ai fini par me confondre plus que de répondre aux questions. Je veux utiliser un DI dans mon projet afin que je puisse faire des tests appropriés et toutes les autres choses merveilleuses qui viennent avec DI.Petit peu confondu avec l'injection de dépendance

Cependant je suis en train de lire ceci et tout cela fait sens jusqu'à ce que http://symfony.com/doc/master/components/dependency_injection/introduction.html#avoiding-your-code-becoming-dependent-on-the-container

Comment votre code ne dépend du récipient, n'est pas comment vous y accéder?

Supposons que vous avez une classe avec foo et une classe avec 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(); } 
} 

Donc, vous ajouteriez la dépendance de Bar Foo par

use Symfony\Component\DependencyInjection\ContainerBuilder; 

$container = new ContainerBuilder(); 
$container->register('foo', 'Foo')->addArgument(new Reference('Bar')); 

Alors, vous voulez utiliser Foo (imprimer bonjour monde) vous feriez quelque chose comme

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

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

Ou quelque chose comme ça. Mais ce document semble dire ne pas utiliser $ container-> get? Sauf si j'ai tort.

Répondre

0

Je pense que vous avez mal compris Avoiding Your Code Becoming Dependent on the Container. Vous décourager de faire quelque chose comme ceci:

class Foo 
{ 

    protected $container; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    public function foo() 
    { 
     $bar = $this->container->get('bar'); 
     $bar->bar(); 
    } 
} 

De cette façon, votre code est lié à un conteneur de service où le service bar est présent. Donc, en général, ne demandez que ce dont vous avez besoin (bar), et ne demandez pas l'univers entier (service_container).

Soit dit en passant, sans utiliser $container->get(), vous pouvez toujours utiliser quelque chose comme $bar = new Bar(); $foo = new Foo($bar);

+0

Ahh! Cela a du sens maintenant. – Steven