Featured image of post Was sind die logischen Unterschiede zwischen bind(), singleton(), scoped() und instance() in Laravel? In welchen Szenarien können sie verwendet werden?

Was sind die logischen Unterschiede zwischen bind(), singleton(), scoped() und instance() in Laravel? In welchen Szenarien können sie verwendet werden?

Was sind die logischen Unterschiede zwischen bind(), singleton(), scoped() und instance() in Laravel? In welchen Szenarien können sie verwendet werden?

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.

Reference

All rights reserved,未經允許不得隨意轉載
Erstellt mit Hugo
Theme Stack gestaltet von Jimmy