Apparence
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
| Contrat | Répond à | Défaut (B2C) |
|---|---|---|
CurrentCartResolver | le panier courant (et sa famille devise/zone) | panier du compte, ou panier invité (cookie) |
CurrentCurrencyResolver | la devise d'affichage | cookie, sinon devise du shop |
CurrentAreaResolver | la zone fiscale | zone de l'adresse de facturation, sinon zone par défaut |
TaxResolver | le taux de taxe pour une règle + une zone | taux 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_idpar défaut) etshop.cookies.currency(currency_isopar défaut). Renommez-les en config — ou via les variables d'environnementCART_COOKIE/CURRENCY_COOKIE— sans remplacer le résolveur.
Voir aussi
- Le conteneur & les contrats — le mécanisme sous-jacent.
- Les pipelines — les consommateurs principaux du contexte.