Wat is Context?
De Context-functionaliteit van Laravel is een mechanisme om informatie vast te leggen en te delen over requests, queue-jobs en commando-uitvoeringen heen. Wanneer je informatie toevoegt via deIlluminate\Support\Facades\Context-facade, wordt die informatie automatisch toegevoegd aan alle logregels die je applicatie wegschrijft.
Hierdoor kun je duidelijk onderscheid maken tussen informatie die je aan individuele log-aanroepen meegeeft en de gedeelde informatie die Context bewaart.
Dit is vooral nuttig voor tracing in gedistribueerde systemen en architecturen met queues.
Propagatieflow van de context
Basisgebruik
De meest typische toepassing is het instellen van eentrace_id in middleware. Die wordt daarna automatisch opgenomen in alle volgende logregels.
1
Maak een middleware
2
Voeg een trace-ID toe aan de Context
3
Registreer de middleware
Registreer hem als globale middleware in
bootstrap/app.php.url en trace_id automatisch toegevoegd aan logs die je in controllers of services wegschrijft.
Schrijven naar de context
add — een waarde toevoegen
add overschrijft bestaande sleutels. Wil je alleen toevoegen als de sleutel nog niet bestaat, gebruik dan addIf.
increment / decrement — tellers beheren
Speciale methoden om numerieke waarden te verhogen of te verlagen. Met het tweede argument geef je de stapgrootte op.when — voorwaardelijk toevoegen
Met dewhen-methode kun je verschillende data toevoegen afhankelijk van of de voorwaarde true of false is.
push — toevoegen aan een stack
Context ondersteunt “stacks” die data in lijstvorm bewaren. Metpush stapelt de data zich op in de volgorde waarin je hem toevoegt.
De context ophalen
get / all
only / except — slechts een deel ophalen
pull / pop — ophalen en verwijderen
pull haalt de waarde van een sleutel op en verwijdert die tegelijkertijd uit de context.
pop om de laatste waarde van een stack te halen.
remember — instellen en teruggeven als de sleutel niet bestaat
has / missing — controleren of een sleutel bestaat
has geeft true terug, zelfs als er null is opgeslagen. Het controleert alleen of de sleutel geregistreerd is.Context verwijderen
Verwijder een sleutel metforget.
Context met scope
Met descope-methode kun je de context tijdelijk wijzigen tijdens de uitvoering van een closure; daarna wordt automatisch de oorspronkelijke toestand hersteld.
Dit is handig in tests of lokale bewerkingen waarbij je tijdelijk extra informatie in logs wilt opnemen.
Hidden context
Data die je niet in logs wilt laten verschijnen (wachtwoorden, API-sleutels, persoonsgegevens, enz.) sla je op in de hidden context. Deze data is niet op te halen met de gewoneget-methode; je kunt er alleen bij via speciale methoden zoals getHidden.
Doorgeven aan queue-jobs
Wanneer je een job naar de queue dispatcht, wordt de huidige context automatisch geserialiseerd en opgenomen in de payload van de job. Bij het uitvoeren van de job wordt de oorspronkelijke context hersteld, zodat detrace_id die je bij het request hebt toegevoegd automatisch wordt doorgegeven aan de logs op de queue.
trace_id van het request ook in de logs op de queue is opgenomen.
Dehydrating — aanpassen bij het verzenden van een job
MetContext::dehydrating kun je de context bewerken vlak voordat de job wordt verzonden.
Dit gebruik je bijvoorbeeld als je de locale, bepaald door de Accept-Language-header, aan de queue wilt doorgeven.
Hydrated — herstellen bij het uitvoeren van een job
MetContext::hydrated kun je logica toevoegen op het moment dat de context wordt hersteld, vlak voordat de job wordt uitgevoerd.
Bijvoorbeeld om de opgeslagen locale weer in de configuratie te zetten:
Samenvatting
Het verschil tussen Context en Log::withContext
Het verschil tussen Context en Log::withContext
Veelvoorkomende patronen voor Dehydrate/Hydrate
Veelvoorkomende patronen voor Dehydrate/Hydrate
- Locale doorgeven: sla
app.localeop in de hidden context metdehydratingen herstel hem metConfig::setinhydrated. - Authenticatiegegevens propageren: zorg dat gegevens van de geauthenticeerde gebruiker uit het request ook beschikbaar zijn in queue-jobs.
- Tenant-ID: deel de tenant-identifier over de queue heen in multi-tenant-applicaties.