Contexte

Parfois, vous avez besoin d'enregistrer pourquoi quelque chose s'est produit, et pas seulement ce qui a changé. AuditChain::context() vous permet d'attacher des métadonnées arbitraires à tous les logs d'audit suivants — le nom du fichier d'import, un identifiant de ticket support, un numéro de lot de migration.

Définir le contexte

use GrayMatter\AuditChain\Facades\AuditChain;

AuditChain::context(['source' => 'csv_import', 'file' => 'users.csv']);

// Tous les logs d'audit créés après cela incluent le contexte
User::create(['name' => 'Alice', 'email' => 'alice@example.com']);
User::create(['name' => 'Bob', 'email' => 'bob@example.com']);

Les deux logs d'audit auront {"source": "csv_import", "file": "users.csv"} dans leur colonne context.

Fusion du contexte

Appeler context() plusieurs fois fusionne les valeurs :

AuditChain::context(['source' => 'api']);
AuditChain::context(['request_id' => 'req-abc-123']);

// Le contexte est maintenant : {'source': 'api', 'request_id': 'req-abc-123'}

Effacer le contexte

Effacez le contexte lorsque vous avez terminé pour éviter qu'il ne se propage à des opérations non liées :

AuditChain::clearContext();

Un schéma typique dans un contrôleur ou un job :

AuditChain::context(['ticket' => 'SUP-1234']);

$user->update(['email' => $newEmail]);

AuditChain::clearContext();

Exemple avec un middleware

Pour un contexte au niveau de la requête, définissez-le dans un middleware :

class AuditContextMiddleware
{
    public function handle($request, Closure $next)
    {
        AuditChain::context([
            'request_id' => $request->header('X-Request-ID'),
        ]);

        $response = $next($request);

        AuditChain::clearContext();

        return $response;
    }
}

Combinaison avec les batches

Le contexte et le batch grouping fonctionnent ensemble. Le contexte est attaché à chaque entrée de log, et le batch UUID les regroupe :

AuditChain::context(['reason' => 'bulk_price_update']);

AuditChain::batch(function () use ($products) {
    foreach ($products as $product) {
        $product->update(['price' => $product->price * 1.1]);
    }
});

AuditChain::clearContext();

Note sur la chaîne de hash

Comme le batch_uuid, le context est intentionnellement exclu du calcul du hash. Il s'agit de métadonnées opérationnelles et n'affecte pas l'intégrité de la chaîne.