Vergleich der Objektbindungsmethoden im Laravel Service Container
| Methode | bind() |
singleton() |
scoped() |
instance() |
|---|---|---|---|---|
| Beschreibung | Erstellt jedes Mal eine neue Instanz, wenn sie aufgelöst wird. | Erstellt nur eine Instanz und gibt dieselbe Instanz bei nachfolgenden Anfragen zurück. | Erstellt nur eine Instanz innerhalb jedes Anfrage-/Job-Lebenszyklus; sie wird nach Beendigung der Anfrage gelöscht. | Bindet eine vorhandene Instanz an den Container und gibt diese Instanz jedes Mal zurück, wenn sie aufgelöst wird. |
| Vorteile | - Eine frische Instanz für jede Anfrage, keine Probleme mit geteiltem Zustand - Saubere Speichernutzung - Geeignet für Logik, die unabhängigen Zustand erfordert - Kann eine eindeutige Konfiguration für jede Anfrage bereitstellen |
- Spart Systemressourcen, indem eine Instanz nur einmal erstellt wird - Gewährleistet Zustandskonsistenz - Geeignet für das Teilen von Konfiguration und Ressourcen - Bessere Leistung bei hoher Gleichzeitigkeit |
- Gleicht Speichernutzung und Teilen von Zustand aus - Teilt den Zustand innerhalb einer Anfrage, ist aber zwischen Anfragen isoliert - Geeignet für Web-Anfrageszenarien |
- Volle Kontrolle über den Zeitpunkt der Instanzerstellung - Kann den Instanzzustand vorkonfigurieren - Geeignet für Dienste, die eine spezifische Konfiguration erfordern |
| Nachteile | - Erfordert mehr Systemressourcen, um Instanzen wiederholt zu erstellen - Kann die Leistung bei hoher Gleichzeitigkeit beeinträchtigen - Nicht geeignet für Szenarien, die geteilten Zustand erfordern - Kann Leistungsprobleme verursachen, da jedes Mal eine neue Instanz erstellt wird. |
- Geteilter Zustand kann zu schwer nachvollziehbaren Fehlern führen - Nicht geeignet für Szenarien, die unabhängigen Zustand erfordern - Speichernutzung bleibt bestehen, bis das Programm endet - Tests erfordern besondere Aufmerksamkeit beim Zurücksetzen des Zustands - Wenn die Instanz einen Zustand hält, kann dies zu unerwartetem Verhalten führen. |
- Kann Probleme bei lang laufenden Aufgaben verursachen - Erfordert Verständnis des Anfrage-Lebenszyklus - Nicht geeignet für CLI-Befehle |
- Weniger flexibel - Kann die Instanzkonfiguration nicht dynamisch anpassen - Kann Speicher beim Start belegen - Nicht geeignet für Fälle, die Lazy Loading oder mehrere Instanzen erfordern. |
| Anwendungsfall | Für kurzlebige Dienste oder Klassen, die unabhängigen Zustand erfordern. | Für global geteilte Dienste, wie Logger oder Konfigurationsmanager. | Für Dienste, die den Zustand innerhalb einer Anfrage beibehalten müssen, aber nicht über Anfragen hinweg, wie Datenbankverbindungen. | Wenn Sie bereits eine Instanz haben und diese wiederverwenden möchten, wie ein geteiltes Konfigurationsobjekt. |
| Beispiel | Wenn Sie eine Product-Klasse haben und jedes Mal, wenn unterschiedliche Produktdaten angefordert werden, eine neue Product-Instanz erstellen möchten. |
Wenn Sie eine Logger-Klasse haben und möchten, dass alle Protokollschreibvorgänge dieselbe Instanz verwenden, um Konsistenz zu wahren. |
Wenn Sie eine ShoppingCart-Klasse haben und den Warenkorbzustand innerhalb derselben Anfrage teilen müssen. |
Wenn Sie eine DatabaseConfig-Klasse haben und Verbindungsparameter beim Start der Anwendung festlegen müssen. |
Beispiele
Verwendung von bind()
$this->app->bind('Product', function () {
return new Product();
});
Jedes Mal, wenn app('Product') aufgerufen wird, wird eine neue Product-Instanz zurückgegeben.
Verwendung von singleton()
$this->app->singleton('Logger', function () {
return new Logger();
});
Jedes Mal, wenn app('Logger') aufgerufen wird, wird dieselbe Logger-Instanz zurückgegeben.
Verwendung von scoped()
$this->app->scoped(Transistor::class, function (Application $app) {
return new Transistor($app->make(PodcastParser::class));
});
Teilt dieselbe Instanz innerhalb desselben Anfrage-Lebenszyklus; verschiedene Anfragen erstellen neue Instanzen.
Verwendung von instance()
$service = new Transistor(new PodcastParser);
$this->app->instance(Transistor::class, $service);
Bindet eine vorhandene Instanz direkt an den Container.
Zusammenfassung
Laravel kann derzeit in vielen verschiedenen Arten von Szenarien angewendet werden, wie Web-Anfragen, CLI-Befehlen, Queue-Jobs, Konsolenbefehlen usw.
Daher müssen Sie bei der Auswahl der zu verwendenden Bindungsmethode die Anforderungen des Dienstes in verschiedenen Szenarien berücksichtigen und ob Sie Zustand oder Konfiguration teilen müssen.