Was ist Context?
Die Context-Funktion von Laravel ist ein Mechanismus, mit dem Sie Informationen über HTTP-Requests, Queue-Jobs und Commands hinweg speichern und teilen können. Wenn Sie über die FacadeIlluminate\Support\Facades\Context Informationen hinzufügen, werden diese automatisch an alle Log-Einträge angehängt, die Ihre Anwendung schreibt.
Dadurch lassen sich Informationen aus einzelnen Log-Aufrufen sauber von den geteilten Kontextdaten unterscheiden.
Besonders nützlich ist das für Tracing in verteilten Systemen oder in Architekturen mit Queues.
Ausbreitung des Kontexts
Grundlegende Verwendung
Das typischste Muster ist das Setzen einertrace_id in einer Middleware. Alle nachfolgenden Log-Einträge enthalten sie dann automatisch.
1
Middleware erstellen
2
Trace-ID zum Kontext hinzufügen
3
Middleware registrieren
Registrieren Sie sie in
bootstrap/app.php als globale Middleware.url und trace_id versehen.
In den Kontext schreiben
add – Werte hinzufügen
add überschreibt vorhandene Schlüssel. Möchten Sie nur hinzufügen, wenn der Schlüssel noch nicht existiert, verwenden Sie addIf.
increment / decrement – Zähler verwalten
Spezielle Methoden zum Erhöhen oder Verringern von Zahlenwerten. Der zweite Parameter gibt die Schrittweite an.when – bedingt hinzufügen
Mitwhen können Sie je nach true-/false-Zweig unterschiedliche Werte hinzufügen.
push – auf einen Stack legen
Der Kontext unterstützt listenartige „Stacks”. Mitpush fügen Sie Daten in der angegebenen Reihenfolge hinzu.
Kontext lesen
get / all
only / except – nur Teile abrufen
pull / pop – abrufen und entfernen
pull liest den Wert eines Schlüssels und entfernt ihn zugleich aus dem Kontext.
pop holen Sie den letzten Wert von einem Stack.
remember – setzen, falls nicht vorhanden
has / missing – Existenz prüfen
has liefert auch dann true, wenn null als Wert gespeichert ist. Geprüft wird lediglich, ob der Schlüssel existiert.Kontext entfernen
Mitforget löschen Sie einen Schlüssel.
Kontext mit Scope
Mit der Methodescope können Sie den Kontext nur während der Ausführung einer Closure vorübergehend ändern und den ursprünglichen Zustand danach automatisch wiederherstellen.
Praktisch, wenn Sie in Tests oder lokalen Verarbeitungsschritten temporäre Zusatzinformationen ins Log aufnehmen möchten.
Hidden Context
Daten, die nicht in Logs auftauchen sollen (Passwörter, API-Schlüssel, personenbezogene Daten), speichern Sie im Hidden Context. Sie können nicht mit der regulärenget-Methode gelesen werden, sondern nur über dedizierte Methoden wie getHidden.
Übergabe an Queue-Jobs
Beim Dispatchen eines Jobs wird der aktuelle Kontext automatisch serialisiert und in den Job-Payload eingebettet. Beim Ausführen des Jobs wird der ursprüngliche Kontext wiederhergestellt, sodass zum Beispiel dietrace_id aus dem Request auch in Logs des Queue-Jobs erhalten bleibt.
trace_id aus dem Request auch in Log-Einträgen aus dem Queue-Job erscheint.
Dehydrating – Anpassungen beim Verschicken des Jobs
MitContext::dehydrating können Sie den Kontext unmittelbar vor dem Versand des Jobs anpassen.
Zum Beispiel, um die durch den Header Accept-Language bestimmte Locale an die Queue zu übertragen.
Hydrated – Wiederherstellung beim Ausführen des Jobs
MitContext::hydrated können Sie unmittelbar nach dem Wiederherstellen des Kontexts vor der Job-Ausführung eingreifen.
Zum Beispiel, um die zuvor gespeicherte Locale in die Konfiguration zu übernehmen.
Zusammenfassung
Context vs. Log::withContext
Context vs. Log::withContext
Häufige Muster mit Dehydrate/Hydrate
Häufige Muster mit Dehydrate/Hydrate
- Locale übernehmen: In
dehydratingapp.localeim Hidden Context speichern, inhydratedperConfig::setwiederherstellen. - Auth-Informationen weiterreichen: Informationen zum im Request authentifizierten Nutzer im Queue-Job weiter nutzbar machen.
- Tenant-ID: In Multi-Tenant-Anwendungen die Tenant-Kennung queue-übergreifend teilen.