Skip to content

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èleRôleÀ savoir
Productun produit (ou une variante)multilingue (name, slug en JSON), indexé (Scout), statut (ProductStatus)
Categorycatégoriearbre imbriqué (nested set) ; rattachement many-to-many aux produits
Attribute / AttributeValueaxes de variation (Couleur → Rouge…)servent à générer les variantes et à porter les caractéristiques
Pricehistorique de prix HTle 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'extensionMécanique
modifier le prix d'un produitPriceModifierpipeline
relier mes données à un produit / une catégorieresolveRelationUsingrelations
ajouter un champ riche/traduit sans migrationHasContents (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