Context::set
(PHP 8.6+, True Async 1.0)
php
public Context::set(string|object $key, mixed $value, bool $replace = false): ContextImposta un valore nel contesto corrente con la chiave specificata. Per impostazione predefinita, se la chiave esiste gia', il valore non viene sovrascritto. Per forzare la sovrascrittura, usa il parametro replace = true.
Il metodo restituisce l'oggetto Context, consentendo il concatenamento dei metodi.
Parametri
key : La chiave per cui impostare il valore. Puo' essere una stringa o un oggetto. Le chiavi oggetto sono utili per evitare conflitti di nome tra librerie.
value : Il valore da memorizzare. Puo' essere di qualsiasi tipo.
replace : Se false (predefinito) --- non sovrascrive un valore esistente. Se true --- sovrascrive il valore anche se la chiave esiste gia'.
Valore di ritorno
L'oggetto Context per il concatenamento dei metodi.
Esempi
Esempio #1 Impostazione di valori con chiavi stringa
php
<?php
use function Async\current_context;
// Concatenamento dei metodi
current_context()
->set('request_id', 'req-001')
->set('user_id', 42)
->set('locale', 'ru_RU');
echo current_context()->find('request_id') . "\n"; // "req-001"
echo current_context()->find('user_id') . "\n"; // 42Esempio #2 Comportamento senza sovrascrittura
php
<?php
use function Async\current_context;
current_context()->set('mode', 'production');
// Impostazione di nuovo senza replace — il valore NON cambia
current_context()->set('mode', 'debug');
echo current_context()->find('mode') . "\n"; // "production"
// Con replace = true — il valore viene sovrascritto
current_context()->set('mode', 'debug', replace: true);
echo current_context()->find('mode') . "\n"; // "debug"Esempio #3 Chiavi oggetto per l'isolamento delle librerie
php
<?php
use function Async\current_context;
use function Async\spawn;
// Ogni libreria usa la propria chiave oggetto
class LoggerContext {
public static object $key;
}
LoggerContext::$key = new stdClass();
class CacheContext {
public static object $key;
}
CacheContext::$key = new stdClass();
current_context()
->set(LoggerContext::$key, new FileLogger('/var/log/app.log'))
->set(CacheContext::$key, new RedisCache('localhost:6379'));
spawn(function() {
$logger = current_context()->find(LoggerContext::$key);
$cache = current_context()->find(CacheContext::$key);
$logger->info('Cache inizializzata');
});Esempio #4 Passaggio del contesto alle coroutine figlie
php
<?php
use function Async\current_context;
use function Async\spawn;
// Contesto genitore
current_context()
->set('trace_id', bin2hex(random_bytes(8)))
->set('service', 'api-gateway');
// Le coroutine figlie ereditano i valori tramite find()
spawn(function() {
$traceId = current_context()->find('trace_id');
echo "Elaborazione richiesta: {$traceId}\n";
// La coroutine figlia aggiunge il proprio valore
current_context()->set('handler', 'user_controller');
});Vedi anche
- Context::unset --- Rimuovi il valore per chiave
- Context::find --- Cerca il valore per chiave
- Context::get --- Ottieni il valore (lancia eccezione)
- current_context() --- Ottieni il contesto dello Scope corrente