03-comment-je-travaille/guides/pattern-dashboard-modulaire.md

Pattern — tableau de bord modulaire

Pattern réutilisable validé en prod sur le back-office codexia (/admin, v0.5.0, 2026-06-01). À suivre par toute instance qui veut donner à un module une présence sur le tableau de bord sans coupler ce dernier aux données internes du module.

Problème

Un tableau de bord d'administration agrège des informations de plusieurs domaines (veille, RAG, conso API, comptes…). L'écueil classique : le contrôleur du dashboard interroge directement les repositories de chaque domaine, accumule la logique de tous les modules, et devient un point de couplage qui casse à chaque évolution d'un module.

Principe — chaque module expose sa propre carte

Le dashboard ne fait que composer ; chaque module rend sa carte.

  1. Chaque module expose une action card() (protégée ROLE_ADMIN) sur son contrôleur d'admin. Elle rend un partial dédié templates/admin/dashboard/_<module>.html.twig : une synthèse (les chiffres essentiels) + les actions clés du module.
  2. Le tableau de bord /admin ne fait que composer, via des sous-requĂŞtes (fragments Symfony) :
    {{ render(controller('App\\Controller\\Admin\\VeilleDashboardController::card')) }}
    {{ render(controller('App\\Controller\\Admin\\MetricsController::card')) }}
    {{ render(controller('App\\Controller\\Admin\\RagController::card')) }}
    {{ render(controller('App\\Controller\\Admin\\UserController::card')) }}
    
    Le dashboard ignore ce que chaque carte contient : il n'a aucune connaissance des données internes des modules.

Bénéfices

  • Modules autonomes, zĂ©ro couplage : la logique de prĂ©sentation et de requĂŞte d'un module reste dans son contrĂ´leur. Le dashboard ne rĂ©fĂ©rence jamais un repository de domaine.
  • Ajouter un module au dashboard = une ligne render(controller(...)). Le retirer = supprimer cette ligne. Aucune autre modification du dashboard.
  • Évolution isolĂ©e : changer les chiffres d'une carte ne touche que le module concernĂ©.

Convention de carte

  • Bloc Bootstrap card : header = titre du module · body = chiffres clĂ©s · footer = boutons d'action.
  • DĂ©gradation propre : si la donnĂ©e est indisponible (ex. RAG sans index, microservice down), la carte affiche un Ă©tat dĂ©gradĂ© clair (bannière/message) plutĂ´t que de planter le dashboard entier. Une sous-requĂŞte qui Ă©choue ne doit pas faire tomber la page.
  • AccessibilitĂ© RGAA AA comme toute surface UI (cf. accessibility.md) ; rendu serveur, pas de logique mĂ©tier dans le Twig.

Conséquence observée

Sur codexia, la page dédiée /admin/veille a disparu : son contenu est devenu la carte Veille du dashboard (la route redirige). Quand une carte porte l'essentiel, la page séparée n'a plus de raison d'être — un clic en moins.

Quand NE pas l'appliquer

  • Un seul module : pas de dashboard, pas de pattern — la page du module suffit.
  • Une vue qui a besoin d'une corrĂ©lation entre modules (jointure de donnĂ©es de plusieurs domaines) : ce n'est plus une composition de cartes indĂ©pendantes, ça relève d'un service de reporting dĂ©diĂ©. Le pattern vaut pour des cartes autonomes, pas pour de l'agrĂ©gation transverse.

Voir aussi

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #