Apparence
Étendre Slab — vue d'ensemble
Slab est conçu pour être étendu sans être modifié. Plutôt que d'apprendre des dizaines de cas particuliers, vous apprenez une poignée de mécaniques génériques — et vous les retrouvez partout.
Le principe : un seul sens de dépendance
Le cœur (slab/framework) n'expose que des contrats. Les features les implémentent, le frontend les consomme. Personne ne dépend de personne d'autre que du cœur :
Vous étendez Slab depuis l'extérieur : un package / plugin quand le comportement est réutilisable et reproductible sur plusieurs projets, la couche applicative du skeleton pour le sur-mesure d'une seule appli. Dans les deux cas, le cœur reste une dépendance Composer mise à jour normalement — jamais forkée. Tout point du cœur est conçu pour être substitué par ce biais, sans cul-de-sac.
Les mécaniques
Tout l'art d'étendre Slab tient dans sept mécaniques. Chacune a sa page, avec le même fil : le problème → le principe → un exemple → où Slab l'utilise → comment l'employer.
| Mécanique | En une phrase | Pour… |
|---|---|---|
| Le conteneur & les contrats | Remplacer ou décorer n'importe quelle implémentation par défaut | changer un comportement du cœur |
| Les pipelines | Transformer une valeur via une chaîne de maillons | le prix, les totaux |
| Les registres | Contribuer un élément à une liste agrégée par le cœur | menu, routes, étapes, options |
| Les résolveurs de contexte | Remplacer une décision « quel est le X courant » | panier, devise, zone, taxe |
| Les hooks & slots de vue | Greffer du contenu dans une vue existante | onglets BO, slots front |
| Modèles & relations | Greffer des relations, étendre un modèle du cœur | relier vos données au domaine |
| Les événements | Réagir à ce qui se passe dans le domaine | e-mail, indexation, intégrations |
« Je veux… » → quelle mécanique
| Je veux… | Mécanique |
|---|---|
| changer le calcul d'un prix, ajouter une remise | pipeline |
| ajouter une ligne aux totaux (livraison, éco-part…) | pipeline |
| ajouter une entrée au menu du back-office | registre (BackMenuRegistry) |
| ajouter des routes (back ou front) | registre (RouteContributionRegistrar) |
| ajouter un mode de livraison / paiement au checkout | registre (CheckoutOptionProvider) |
| changer la devise ou la zone fiscale courante | résolveur |
| remplacer un service du cœur | conteneur |
| ajouter un onglet à la fiche produit | hook de vue |
| relier mes tables aux modèles du cœur | relations |
| envoyer un e-mail à la commande | événement (OrderPlaced) |
| changer l'apparence d'une page | surcharger une vue |
Ce qui est extensible aujourd'hui
La surface complète et à jour est dans la référence des points d'extension (extraite du code). En bref :
| Domaine | État |
|---|---|
| Prix & totaux (pipelines) | ✅ ouvert |
| Résolveurs de contexte (panier, devise, zone, taxe) | ✅ ouvert |
| Checkout (étapes, options, flow) | ✅ ouvert |
| Menu & routes back/front | ✅ ouvert |
| Relations sur les modèles | ✅ ouvert (ajout) |
| Événements de domaine | ✅ ouvert |
| Vues (cascade) & traductions | ✅ ouvert |
| Hooks de vue (onglets/sections) | ✅ ouvert (tous les écrans d'édition) |
| Services internes (derrière contrats) | ✅ ouvert |
| Orchestrateurs (placement de commande, pricing, totaux) | ✅ substituables (contrat + binding) |
Gardes du back-office (groupe de middleware back) | ✅ ouvert |
| Substitution de classe de modèle | ⚪ par choix de conception — la morph map couvre le besoin |
Le fil rouge
Toutes ces mécaniques s'activent au même endroit : le boot() du service provider d'un package ou de votre application. Voir Créer un package pour le squelette.