2012-03-26 4 views
14

Ich lese diese: http://symfony.com/doc/current/book/service_container.htmlSymfony 2-Dienst mit mehreren Instanzen?

Es wird gesagt:

$mailer = $this->get('my_mailer'); 

Als zusätzlichen Bonus wird der Mailer-Dienst nur einmal erstellt und die gleiche Instanz wird jedes Mal, wenn Sie für den Dienst stellen zurückgegeben. Das ist fast immer das Verhalten, das Sie benötigen (es ist flexibler und leistungsstark), , aber wir werden später lernen, wie Sie einen Dienst konfigurieren können, dass mehrere Instanzen hat.

Wie mache ich meinen Service, um mehrere Instanzen zu haben - d. H., Wenn ich den Service erreiche, bekomme ich eine neue Instanz? Etwas wie $this->getNew() oder etwas?

Antwort

31

Sie sprechen über den Umfang eines Dienstes. Sie können sie nachschlagen here. Kurz gesagt, Ihren Dienst als Rahmen Prototyp anstelle des Behälters Standard definieren und die Dependency Injection Container kümmern wird jedes Mal ein neues Objekt erstellen fordern Sie es:

services: 
    my_service: 
     class: Someclass 
     scope: prototype 

Hinweis: seit Symfony2.8, scope: prototype hat ersetzt durch shared: false.

# Symfony >= 2.8 
services: 
    my_service: 
     class: Someclass 
     shared: false 
+4

Gibt es eine Möglichkeit, die Wiederherstellung manchmal nur nicht immer zu erzwingen? –

+0

@RezaSanaie Sie müssten wahrscheinlich einen abstrakten Service definieren und ihn zweimal erweitern, um einen Prototyp und eine Container-Scoped-Version davon zu haben. Wenn Sie die neue Instanz des Prototyps persistieren müssen, können Sie den Container aufheben, indem Sie ihm die neue Instanz zuweisen. –