Context::set

(PHP 8.6+, True Async 1.0)

public Context::set(string|object $key, mixed $value, bool $replace = false): Context

Setzt einen Wert im aktuellen Kontext mit dem angegebenen Schluessel. Standardmaessig wird der Wert nicht ueberschrieben, wenn der Schluessel bereits existiert. Um das Ueberschreiben zu erzwingen, verwenden Sie den Parameter replace = true.

Die Methode gibt das Context-Objekt zurueck und ermoeglicht so Methodenverkettung.

Parameter

key
Der Schluessel, fuer den der Wert gesetzt werden soll. Kann ein String oder ein Objekt sein. Objekt-Schluessel sind nuetzlich, um Namenskonflikte zwischen Bibliotheken zu vermeiden.
value
Der zu speichernde Wert. Kann von beliebigem Typ sein.
replace
Wenn false (Standard) — einen bestehenden Wert nicht ueberschreiben. Wenn true — den Wert ueberschreiben, auch wenn der Schluessel bereits existiert.

Rueckgabewert

Das Context-Objekt fuer Methodenverkettung.

Beispiele

Beispiel #1 Werte mit String-Schluesseln setzen

<?php

use function Async\current_context;

// Methodenverkettung
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";    // 42

Beispiel #2 Verhalten ohne Ueberschreiben

<?php

use function Async\current_context;

current_context()->set('mode', 'production');

// Erneutes Setzen ohne replace — Wert aendert sich NICHT
current_context()->set('mode', 'debug');
echo current_context()->find('mode') . "\n"; // "production"

// Mit replace = true — Wert wird ueberschrieben
current_context()->set('mode', 'debug', replace: true);
echo current_context()->find('mode') . "\n"; // "debug"

Beispiel #3 Objekt-Schluessel fuer Bibliotheksisolierung

<?php

use function Async\current_context;
use function Async\spawn;

// Jede Bibliothek verwendet ihren eigenen Objekt-Schluessel
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 initialisiert');
});

Beispiel #4 Kontext an Kind-Koroutinen weitergeben

<?php

use function Async\current_context;
use function Async\spawn;

// Eltern-Kontext
current_context()
    ->set('trace_id', bin2hex(random_bytes(8)))
    ->set('service', 'api-gateway');

// Kind-Koroutinen erben Werte ueber find()
spawn(function() {
    $traceId = current_context()->find('trace_id');
    echo "Anfrage wird verarbeitet: {$traceId}\n";

    // Kind-Koroutine fuegt eigenen Wert hinzu
    current_context()->set('handler', 'user_controller');
});

Siehe auch