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 facade Illuminate\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.
Esempio di storico di esecuzione query in uno stack.
use Illuminate\Support\Facades\Context;use Illuminate\Support\Facades\DB;// Nel metodo boot di AppServiceProvider.phpDB::listen(function ($event) { Context::push('queries', [$event->time, $event->sql]);});
Con scope 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.
use Illuminate\Support\Facades\Context;use Illuminate\Support\Facades\Log;Context::add('trace_id', 'abc-999');Context::addHidden('user_id', 123);Context::scope( function () { Context::add('action', 'adding_friend'); $userId = Context::getHidden('user_id'); Log::debug("Adding user [{$userId}] to friends list."); // Adding user [987] to friends list. {"trace_id":"abc-999","user_name":"taylor_otwell","action":"adding_friend"} }, data: ['user_name' => 'taylor_otwell'], hidden: ['user_id' => 987],);// Terminato lo scope, i valori tornano quelli originaliContext::all();// ['trace_id' => 'abc-999']Context::allHidden();// ['user_id' => 123]
Se modifichi un oggetto dentro lo scope, la modifica si riflette anche fuori. Se usi valori primitivi non c’è problema.
Per dati che non vuoi far apparire nei log (password, chiavi API, dati personali) usa Hidden Context.
Non sono leggibili con get: solo con metodi dedicati come getHidden.
use Illuminate\Support\Facades\Context;Context::addHidden('key', 'value');Context::getHidden('key');// 'value'Context::get('key');// null — non è leggibile con il normale get
Hidden Context espone lo stesso set di metodi del Context normale.
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ì il trace_id impostato nella richiesta viene ereditato anche nei log della coda.
// Impostato nel middlewareContext::add('trace_id', Str::uuid()->toString());// Dispatch del job dal controllerProcessPodcast::dispatch($podcast);
class ProcessPodcast implements ShouldQueue{ use Queueable; public function handle(): void { Log::info('Processing podcast.', ['podcast_id' => $this->podcast->id]); }}
Con Context::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.
Nella callback dehydrating non usare la facade Context: manipola solo il repository $context passato come argomento.
L’uso della facade modificherebbe il Context del processo corrente.
Con Context::hydrated puoi eseguire logica quando il Context viene ripristinato prima dell’esecuzione del job.
Ad esempio, applica al file di configurazione la locale salvata.
// AppServiceProvider.phpuse Illuminate\Log\Context\Repository;use Illuminate\Support\Facades\Config;use Illuminate\Support\Facades\Context;public function boot(): void{ Context::hydrated(function (Repository $context) { if ($context->hasHidden('locale')) { Config::set('app.locale', $context->getHidden('locale')); } });}
Anche nella callback hydrated non usare la facade Context: manipola solo il repository $context passato.