Skip to content

Créer un thème

Dans Slab, tout le front est un package : slab/frontend fournit les contrôleurs, les routes front.*, les vues, les view-models, les assets et le tunnel de commande. Le cœur n'expose, lui, que le domaine et un contrat de noms que le front doit honorer. Personnaliser la présentation se fait à deux niveaux.

Niveau 1 — surcharger des vues (le cas courant)

Le frontend charge ses vues sous le namespace frontend::. Grâce à la cascade Laravel, votre application a la priorité : déposez une vue de même chemin sous resources/views/vendor/frontend/ pour la remplacer.

resources/views/vendor/frontend/
├── layouts/front.blade.php          ← remplace le layout
├── products/show.blade.php          ← remplace la fiche produit
└── components/front/header.blade.php

Aucune configuration : la vue de l'app l'emporte. Vous ne touchez jamais au code du frontend, et vous gardez ses mises à jour pour tout ce que vous ne surchargez pas. Détail : Surcharger une vue.

Niveau 2 — un thème de remplacement complet

Le front étant un package remplaçable, vous pouvez écrire votre propre front à la place de slab/frontend — utile pour une refonte totale. Un thème complet est un package qui, dans son provider :

  1. charge ses vues sous un namespace stable ;
  2. enregistre ses view-models via Blade::component(MyComponent::class, 'front.cart') ;
  3. déclare ses routes front (montées dans booted(), enveloppées du middleware web) ;
  4. fournit ses assets (SCSS/JS) ;
  5. honore les deux contrats du cœur (ci-dessous).

Les contrats à honorer

Un thème complet doit fournir tous les noms de routes garantis et exposer tous les slots — c'est ce qui permet aux packages de fonctionner quel que soit le front :

php
use Slab\Framework\Core\Routing\FrontRouteContract;
use Slab\Framework\Core\View\FrontSlotContract;

FrontRouteContract::names(); // ['front.home', 'front.products.show', 'front.checkout.user.show', …]
FrontSlotContract::names();  // ['front.head', 'front.body.start', 'front.body.end', 'front.checkout.summary']

Exposez les slots avec <x-hook> dans vos layouts ; les packages les remplissent via le ViewHookRegistry.

Le tunnel de commande

Le tunnel d'étapes appartient au front, pas au cœur. Réutilisez le DefaultCheckoutFlow du frontend ou fournissez le vôtre (contrat CheckoutFlow). Les features (transport, paiement) n'exposent que des options en donnée (CheckoutOptionProvider) que le thème rend génériquement — voir Commande & checkout.

Quel niveau choisir ?

BesoinApproche
Changer le style, quelques vuesNiveau 1 : surcharge sous vendor/frontend/
Refondre la présentation sans changer le métierNiveau 1, large
Remplacer entièrement le front (autre rendu, headless…)Niveau 2 : votre package de thème

Dans tous les cas, le domaine reste intact : un thème ne touche jamais au cœur ni aux features.