Apparence
Panier
Le panier porte les lignes produit, la famille de contexte (devise / zone fiscale) et les choix de checkout. Sa logique de contexte et ses événements sont les principaux leviers d'extension.
Le modèle
Cart est polymorphe : il appartient à un User ou à un Guest (morphTo('model')). Ses lignes sont des produits via un pivot (quantity, is_gift). Les choix du tunnel (transporteur, paiement…) sont stockés dans une sélection générique checkout_selections (JSON) — pas de colonne par feature. La fusion d'un panier invité vers un compte émet CartMerged.
Domaine vs contexte : deux rôles distincts
| Classe | Rôle |
|---|---|
CartService | opérations sur un panier explicite : addProduct, updateProduct, deleteProduct, merge, createOrder. Émet les événements. Sans session. |
CurrentCartResolver | contexte : « quel est le panier courant ? » — résolu selon la stratégie (B2C par défaut : compte connecté, sinon cookie). |
C'est la séparation domaine / contexte : CartService agit sur un panier qu'on lui donne ; CurrentCartResolver décide lequel dans la requête.
Par où l'étendre
| Je veux… | Point d'extension | Mécanique |
|---|---|---|
| changer « quel est le panier courant » | CurrentCartResolver (bind) | résolveurs |
| changer la devise / la zone courantes | CurrentCurrencyResolver / CurrentAreaResolver | résolveurs |
| ajouter une ligne aux totaux | TotalsModifier | pipeline |
| réagir aux changements du panier | CartItemAdded / Updated / Removed, CartMerged | événements |
greffer une relation sur Cart | resolveRelationUsing | modèles |
Exemple : réagir à un ajout au panier
php
use Illuminate\Support\Facades\Event;
use Slab\Framework\Core\Cart\Events\CartItemAdded;
Event::listen(CartItemAdded::class, function (CartItemAdded $event) {
// $event->cart, le produit, la quantité — pour de l'analytics, des suggestions…
});Du panier à la commande
CartService::createOrder() délègue à l'OrderPlacementPipeline (transactionnel, idempotent), qui fige la commande. Détail : Commande & checkout.
Voir aussi
- Les résolveurs — le contexte devise/zone/panier.
- Les événements · Pricing & taxe.