Apparence
Catalogue & produits
Le catalogue couvre les produits, les catégories (arbre imbriqué), les attributs et les variantes. C'est le domaine le plus souvent étendu.
Les modèles
| Modèle | Rôle | À savoir |
|---|---|---|
Product | un produit (ou une variante) | multilingue (name, slug en JSON), indexé (Scout), statut (ProductStatus) |
Category | catégorie | arbre imbriqué (nested set) ; rattachement many-to-many aux produits |
Attribute / AttributeValue | axes de variation (Couleur → Rouge…) | servent à générer les variantes et à porter les caractéristiques |
Price | historique de prix HT | le prix « courant » est le dernier ; le calcul passe toujours par le pipeline |
Un produit est rattaché à ses catégories via un pivot (is_main, order) — d'où mainCategory() et un ordre par catégorie.
Les variantes
Une variante est un Product enfant (parent_id pointant le produit parent). Le ProductVariantService génère les variantes comme le produit cartésien des valeurs d'attributs choisies : une variante par combinaison, qui hérite des catégories, des contenus et du prix du parent.
Par où l'étendre
| Je veux… | Point d'extension | Mécanique |
|---|---|---|
| modifier le prix d'un produit | PriceModifier | pipeline |
| relier mes données à un produit / une catégorie | resolveRelationUsing | relations |
| ajouter un champ riche/traduit sans migration | HasContents (contentable) | modèles |
| réagir à un changement du catalogue (réindexer) | ReindexRequested | événements |
| ajouter un onglet à la fiche produit (BO) | ViewHookRegistry (back.products.edit.tabs) | hooks |
Exemple : relier vos données à un produit
C'est ainsi que slab/promotion greffe ses relations, sans que le cœur connaisse Promotion :
php
Product::resolveRelationUsing('promotions',
fn (Product $product) => $product->belongsToMany(Promotion::class));
Category::resolveRelationUsing('promotions',
fn (Category $category) => $category->belongsToMany(Promotion::class));Exemple : réindexer après un changement métier
L'indexation est découplée : les observers du cœur émettent ReindexRequested, un listener queueable réindexe hors requête. Pour réindexer suite à votre propre logique :
php
use Slab\Framework\Core\Search\Events\ReindexRequested;
ReindexRequested::dispatch([$product->id]);Recherche & facettes
Product est Searchable (Meilisearch) : attributs recherchables (names, references), filtrables et à facettes (catégories, valeurs d'attributs, prix). Pour changer ce qui est indexé, surchargez toSearchableArray() sur votre modèle. Détail : Recherche.
Voir aussi
- Les pipelines — le calcul de prix.
- Modèles & relations · Pricing & taxe.