Skip to content

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

ClasseRôle
CartServiceopérations sur un panier explicite : addProduct, updateProduct, deleteProduct, merge, createOrder. Émet les événements. Sans session.
CurrentCartResolvercontexte : « 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'extensionMécanique
changer « quel est le panier courant »CurrentCartResolver (bind)résolveurs
changer la devise / la zone courantesCurrentCurrencyResolver / CurrentAreaResolverrésolveurs
ajouter une ligne aux totauxTotalsModifierpipeline
réagir aux changements du panierCartItemAdded / Updated / Removed, CartMergedévénements
greffer une relation sur CartresolveRelationUsingmodè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