Skip to content

Les résolveurs de contexte

Un résolveur répond à une question de contexte : « quel est le panier courant ? la devise ? la zone fiscale ? le taux de taxe applicable ? ». Chacun est un contrat que vous pouvez remplacer pour changer la stratégie — sans toucher au code qui le consomme.

Le problème

Le calcul d'un prix a besoin de savoir dans quelle devise et quelle zone fiscale se place le client. Un site B2C lit ça d'un cookie et de l'adresse du panier ; un site B2B le déduira du compte entreprise. Le pricing ne doit dépendre d'aucune de ces stratégies — juste d'une question posée.

Le principe

Le cœur demande « le X courant » à un contrat. Une implémentation par défaut (B2C) répond ; vous la remplacez pour changer la logique. C'est une application directe du conteneur & des contrats, spécialisée pour le contexte de la requête.

Les résolveurs de Slab

ContratRépond àDéfaut (B2C)
CurrentCartResolverle panier courant (et sa famille devise/zone)panier du compte, ou panier invité (cookie)
CurrentCurrencyResolverla devise d'affichagecookie, sinon devise du shop
CurrentAreaResolverla zone fiscalezone de l'adresse de facturation, sinon zone par défaut
TaxResolverle taux de taxe pour une règle + une zonetaux par zone, sinon taux par défaut de la règle

Remplacer un résolveur

php
use Slab\Framework\Core\Currency\Contracts\CurrentCurrencyResolver;

$this->app->bind(CurrentCurrencyResolver::class, DeviseParPaysResolver::class);

Votre classe implémente le contrat :

php
use Slab\Framework\Core\Currency\Contracts\CurrentCurrencyResolver;
use Slab\Framework\Models\Currency;

final class DeviseParPaysResolver implements CurrentCurrencyResolver
{
    public function resolve(): Currency
    {
        // votre logique (géo-IP, préférence compte, sous-domaine…)
    }
}

Tout le cœur (prix, totaux, affichage) bascule aussitôt sur votre devise.

Bon à savoir

  • Les résolveurs de contexte sont liés à la requête (scoped) : une instance par requête, jamais de statique partagé entre process.
  • Le défaut est résolument B2C (cookies, fusion panier invité→compte). Une couche B2B (apisell) fournit ses propres résolveurs en les bindant — exactement par ce mécanisme.
  • Les noms des cookies B2C ne sont pas en dur : shop.cookies.cart (cart_id par défaut) et shop.cookies.currency (currency_iso par défaut). Renommez-les en config — ou via les variables d'environnement CART_COOKIE / CURRENCY_COOKIE — sans remplacer le résolveur.

Voir aussi