Cos’è Context
La funzionalità Context di Laravel è un meccanismo per registrare e condividere informazioni attraverso l’esecuzione di richieste, job in coda e comandi. Le informazioni aggiunte tramite la facadeIlluminate\Support\Facades\Context vengono aggiunte automaticamente a tutte le voci di log emesse dall’applicazione.
Ti permette di distinguere chiaramente le informazioni passate a una singola chiamata di log da quelle condivise mantenute da Context.
È particolarmente utile per tracciare sistemi distribuiti o architetture basate su code.
Flusso di propagazione del contesto
Uso di base
Il caso d’uso più tipico è impostare untrace_id in un middleware. Verrà incluso automaticamente in tutte le voci di log successive.
1
Crea il middleware
2
Aggiungi il trace ID a Context
3
Registra il middleware
Registralo come middleware globale in
bootstrap/app.php.url e trace_id.
Scrittura nel Context
add — aggiungere un valore
add sovrascrive una chiave esistente. Per aggiungere solo se non esiste usa addIf.
increment / decrement — gestione di contatori
Metodi dedicati per incrementare/decrementare valori numerici. Il secondo argomento indica la variazione.when — aggiunta condizionale
Conwhen puoi aggiungere dati diversi a seconda che la condizione sia true o false.
push — aggiungere a uno stack
Context supporta uno “stack” per dati in forma di elenco. Conpush i dati si accumulano nell’ordine in cui li aggiungi.
Lettura del Context
get / all
only / except — prendi solo alcune chiavi
pull / pop — leggere ed eliminare
pull legge il valore e lo elimina dal Context.
pop.
remember — se non esiste, imposta e restituisci
has / missing — verifica dell’esistenza
has restituisce true anche se il valore è null. Verifica solo la presenza della chiave.Rimozione dal Context
Conforget elimini una chiave.
Context con scope
Conscope puoi modificare temporaneamente il Context durante l’esecuzione di una closure e ripristinarlo automaticamente al termine.
Utile in test o elaborazioni locali dove vuoi aggiungere informazioni temporanee ai log.
Hidden Context
Per dati che non vuoi far apparire nei log (password, chiavi API, dati personali) usa Hidden Context. Non sono leggibili conget: solo con metodi dedicati come getHidden.
Trasferimento ai job in coda
Quando dispatchi un job nella coda, il Context corrente viene serializzato automaticamente nel payload del job. All’esecuzione del job il Context viene ripristinato, così iltrace_id impostato nella richiesta viene ereditato anche nei log della coda.
trace_id della richiesta compare anche nei log dei job.
Dehydrating — personalizzare l’invio del job
ConContext::dehydrating puoi trasformare il Context appena prima dell’invio del job.
Ad esempio, quando vuoi passare in coda la locale determinata dall’header Accept-Language.
Hydrated — ripristino all’esecuzione del job
ConContext::hydrated puoi eseguire logica quando il Context viene ripristinato prima dell’esecuzione del job.
Ad esempio, applica al file di configurazione la locale salvata.
Riepilogo
Differenze tra Context e Log::withContext
Differenze tra Context e Log::withContext
Pattern comuni di Dehydrate/Hydrate
Pattern comuni di Dehydrate/Hydrate
- Trasferimento della locale: in
dehydratingsalviapp.localein Hidden Context; inhydratedla ripristini conConfig::set. - Propagazione dell’autenticazione: puoi far riferimento nel job alle informazioni dell’utente autenticato nella richiesta.
- Tenant ID: in app multi-tenant condividi l’identificatore di tenant attraverso la coda.