2014-02-20 6 views
5

Ich bin mit symfony/dependency-Injektion Komponente (Anmerkung: nicht den vollständigen Stack-Framework)Symfony Dependency Injection neue Instanz der Klasse injizieren

Wenn Sie einen neuen Dienst i im Konstruktor eine neue Instanz injizieren wollen Registrierung einer Klasse. Beispiel:

$container->register('session', 'Vendor\Core\Session') 
    ->addArgument(new PhpBridgeSessionStorage()); 

Das Beispiel funktioniert sehr gut, aber was ist, wenn ich YML-Dateien für die Definition dieses Dienstes verwenden möchte? Etwas wie:

Bin ich gezwungen, Class \ To \ Inject als neuen Service zu definieren? oder eine Service Factory erstellen?

Antwort

1

Ja, alle Klassen, die Sie injizieren, sollten Dienste sein. Sie können einen Bereich von angeben, um bei jeder Anforderung eine neue Instanz zu erstellen.

Weitere Informationen finden Sie unter: http://symfony.com/doc/current/cookbook/service_container/scopes.html

+1

Diese Konfigurationsdatei verschmutzen mit viel Einsatz-once Dienste bedeuten würde das ha Es gibt keine Abhängigkeiten und das sollte nicht außerhalb des Containergebäudes verwendet werden. Ich würde in diesem Fall lieber diesen Teil des Containers mit PHP erstellen. – spdionis

+0

@spdionis Wenn es nicht außerhalb des Containers verwendet werden soll, sollte es als 'public = false' (privat) markiert werden. Du musst sie in einen Container stecken, so funktioniert es :) –

+1

Ich habe nur Angst, dass ich 100 Dienste bekomme. – spdionis

1

ich jetzt, dass diese Frage ist ziemlich alt, aber hier ist ein Trick, der Sie jede einfache Klasse als Service definieren nutzen könnten, zu vermeiden „Factory-Klasse“ Service definiert, der die Klasse erhalten zu erstellen als Argument und nach durch "Ausdruckssprache" als Argument injiziert:

<?php 

final class ClassFactory 
{ 
    public static function create($class, array $arguments = []) 
    { 
    return new $class($arguments); 
    } 
} 
  • den neuen Dienst erstellen

    app.class_factory: Klasse: Classfactory

  • nach den neuen Klassen wie das injiziert:

    Argumente. [ '@ = Service ("app.class_factory") erstellen ("Monolog \ Logger" ')]

Für Symfony> = 2,8 Sie einen Blick auf die ‚auto-Verdrahtung‘ Funktion nehmen auch ->http://symfony.com/blog/new-in-symfony-2-8-service-auto-wiring