Was ist der Service-Container
Der Service-Container von Laravel ist ein Mechanismus zur Verwaltung von Klassenabhängigkeiten und zur Durchführung von Dependency Injection. Dependency Injection bedeutet, dass die von einer Klasse benötigten Abhängigkeiten über den Konstruktor oder gegebenenfalls über Setter-Methoden in die Klasse „injiziert” werden. Sehen Sie sich das folgende Beispiel an:PodcastController einen Podcast von einer Datenquelle wie Apple Music beziehen. Dazu wird ein Dienst injiziert, der Podcasts abrufen kann. Durch das Injizieren des Dienstes lässt sich beim Testen ein Mock (eine Dummy-Implementierung) des AppleMusic-Dienstes leicht einsetzen.
Ein tiefes Verständnis des Service-Containers ist beim Aufbau großer Laravel-Anwendungen unerlässlich. Es hilft auch dabei, zum Laravel-Core selbst beizutragen.
Zero-Configuration-Auflösung
Wenn eine Klasse nur von anderen konkreten Klassen (keinen Interfaces) abhängt, müssen Sie dem Container nicht mitteilen, wie sie aufzulösen ist. Nehmen Sie zum Beispiel folgenden Code inroutes/web.php an:
In diesem Beispiel wird die Klasse innerhalb der Routendatei definiert – dies dient nur zu Demonstrationszwecken. In einer echten Anwendung sollten Service-Klassen im Verzeichnis
app/Services definiert werden.Service-Klasse automatisch auf und injiziert sie in den Route-Handler. Sie profitieren also von Dependency Injection, ohne eine Konfigurationsdatei anlegen zu müssen.
Bei vielen Klassen, die Sie in einer Laravel-Anwendung schreiben – etwa Controller, Event-Listener oder Middleware – werden Abhängigkeiten automatisch über den Container injiziert.
Bindings
Einfache Bindings
Die meisten Bindings werden innerhalb von Service-Providern registriert. In einem Service-Provider können Sie über die Eigenschaft$this->app auf den Container zugreifen.
bind
Mit derbind-Methode registrieren Sie ein Binding, indem Sie einen Klassen- oder Interface-Namen zusammen mit einer Closure übergeben:
App-Fassade:
Klassen, die nicht von einem Interface abhängen, müssen nicht an den Container gebunden werden. Der Container kann solche Objekte automatisch über Reflection auflösen.
singleton
Diesingleton-Methode bindet eine Klasse oder ein Interface so, dass sie nur ein einziges Mal aufgelöst wird. Ist ein Singleton einmal aufgelöst, gibt der Container bei jedem weiteren Aufruf dieselbe Instanz zurück.
instance
Eine bereits existierende Objektinstanz können Sie über dieinstance-Methode an den Container binden. Bei nachfolgenden Aufrufen des Containers wird stets diese Instanz zurückgegeben.
Interfaces an Implementierungen binden
Eine der leistungsstärksten Funktionen des Service-Containers ist die Möglichkeit, ein Interface an eine bestimmte Implementierung zu binden. Angenommen, es existiert das InterfaceEventPusher und die Implementierung RedisEventPusher:
EventPusher benötigt, den RedisEventPusher. Sie müssen dann lediglich das Interface EventPusher als Type-Hint im Konstruktor angeben:
Automatische Auflösung (DI per Type-Hint)
Wenn der Service-Container Klassen wie Controller, Event-Listener oder Middleware auflöst, berücksichtigt er die Type-Hints des Konstruktors und injiziert die Abhängigkeiten automatisch.UserRepository nicht von einem Interface abhängt, ist keine Registrierung im Container notwendig. Sobald die entsprechende Route aufgerufen wird, löst der Container die Abhängigkeit automatisch auf und injiziert sie in den Controller.
Auflösen aus dem Container
Methode make
Mit der make-Methode können Sie eine Klasseninstanz aus dem Container auflösen:
makeWith zusätzliche Argumente übergeben:
Automatische Injection
In der Praxis rufen Sie diemake-Methode selten direkt auf. Bei Klassen, die vom Container aufgelöst werden – etwa Controller, Event-Listener oder Middleware – reicht es aus, Type-Hints im Konstruktor anzugeben; der Container übernimmt die Injection dann automatisch.
Fassaden und der Container
Die Fassaden von Laravel bieten eine statische Schnittstelle zu Objekten im Container. So ruft beispielsweiseCache::get() intern den Cache-Dienst aus dem Container ab und delegiert den Aufruf an ihn.
Konstruktor-Injection – ein praktisches Beispiel
Betrachten wir ein typisches Muster aus einer realen Anwendung.
Mit diesem Muster genügt es, das Binding an einer einzigen Stelle zu ändern, wenn Sie den Zahlungsdienst zum Beispiel von
Stripe auf einen anderen Anbieter umstellen möchten.
Nächste Schritte
Service-Provider
Erfahren Sie, wie Sie mit Service-Providern Bindings registrieren.