03-comment-je-travaille/guides/architecture-symfony.md

Architecture Symfony — Telaria

Vue d'ensemble de l'architecture applicative. Pas un guide d'installation — une carte de ce qui existe et pourquoi. Pour les guides d'installation des composants IA : voir tutos/ia/.


Vue d'ensemble

Telaria est une application Symfony 7 dĂ©ployĂ©e en production. Elle a Ă©voluĂ© d'un monolithe vers une architecture en bundles rĂ©utilisables via un split progressif. L'application principale (telaria-app) est dĂ©sormais mince — elle assemble les bundles et gĂšre l'authentification.

telaria-app (mince)
├── tlr-symfony     ← socle gĂ©nĂ©rique (multisite, CMS, contact, Markdown)
├── tlr-rag         ← moteur RAG L0 (retrieval, embeddings, index)
├── tlr-codexia     ← produit doc-IA (Veille, Chat, Docs, Metrics, AppSettings)
└── tlr-mcp         ← serveur MCP L1 (protocole Model Context Protocol)

Chaque bundle est un dépÎt GitHub indépendant, versionné en SemVer, consommé via Composer (VCS ou Packagist privé).


Bundles — pĂ©rimĂštres

tlr-symfony — socle gĂ©nĂ©rique multisite

Package : tlr/symfony-bundle · ns : Tlr\Symfony\

Fournit :

  • Multisite : rĂ©solution du site courant par host HTTP (SiteResolver, SiteContext). Un seul dĂ©ploiement Symfony sert N domaines avec des contenus distincts.
  • CMS moteur : entitĂ©s CmsContent, CmsPage, routes canoniques custom par page.
  • Markdown : rendu Markdown → HTML (service rĂ©utilisable).
  • Contact : formulaire de contact avec rate limiter intĂ©grĂ©.
  • i18n : extraction automatique des chaĂźnes.

Couplage app → bundle : resolve_target_entities pour User, interfaces (Tlr\Symfony\Contract\*).

tlr-rag — cƓur RAG L0

Package : telaria/rag-bundle · ns : Telaria\Rag\

Fournit :

  • Ingestion de documents Markdown (app:rag:ingest)
  • Index vectoriel SQLite + sqlite-vec (extension .so chargĂ©e par PHP 8.5)
  • Recherche kNN par cosinus (app:rag:search)
  • Interface de retrieval consommĂ©e par tlr-codexia (L2)
  • Microservice d'embeddings : tlr-embeddings (Python, multilingual-e5-base, port 8001)

ZĂ©ro clĂ© IA en L0 — retrieval pur, pas de gĂ©nĂ©ration.

tlr-codexia — produit doc-IA L2

Package : tlr/codexia-bundle · ns : Tlr\Codexia\

Fournit : Veille · Chat · Docs · Metrics · AppSettings

  • Veille agentique : scheduler → agents de curation → validation BO → sources scorĂ©es
  • Chat documentaire : RAG + gĂ©nĂ©ration Claude (clĂ© API requise)
  • Docs : surface de documentation liĂ©e au corpus RAG
  • Metrics : suivi de consommation IA par modĂšle, coĂ»ts, alertes
  • AppSettings : configuration applicative persistante (BDD)

Couplage : VeilleReaderInterface → User, require telaria/rag-bundle.

tlr-mcp — serveur MCP L1

Package : telaria/mcp-bundle · ns : Telaria\Mcp\

Fournit :

  • Serveur MCP (Model Context Protocol) exposant les documents ingĂ©rĂ©s Ă  Claude
  • 3 outils : list_docs, read_doc, search_docs
  • Auth par token opaque SHA-512, quotas par tenant et par outil
  • tools/list : auth optionnelle

Tourne en production. Un client Claude Desktop ou Cursor peut interroger le corpus via ce serveur.


Patterns Doctrine

Entités auto-mappées

Toutes les entités des bundles utilisent l'auto-mapping Doctrine (pas de fichiers XML/YAML) : zéro migration au bootstrap, couplage via interfaces.

Voters pour l'autorisation

Les rĂšgles d'accĂšs aux ressources sont encapsulĂ©es dans des Voters Symfony (RecipeVoter, etc.) — pas de @IsGranted hardcodĂ© sur les donnĂ©es de tiers.

Messenger (messages asynchrones)

Les tùches longues (ingest RAG, veille agentique) passent par Symfony Messenger : les handlers sont découplés des controllers, les workers systemd consomment la file.

Rate Limiting

Composant RateLimiter Symfony (politique token_bucket) sur :

  • Formulaires de contact
  • Endpoints API

resolve_target_entities

Couplage User → bundles via resolve_target_entities dans doctrine.yaml : les bundles ne dĂ©pendent pas de la classe App\Entity\User, uniquement de leurs interfaces.


Authentification & sécurité applicative

  • SystĂšme de login Symfony Security (form_login)
  • RĂŽles : ROLE_USER, ROLE_ADMIN
  • Protection CSRF sur les suppressions (attribut #[IsCsrfTokenValid])
  • Tokens MCP : SHA-512, rotation possible via commande console
  • Uploads : validation MIME rĂ©elle (finfo), protection path traversal
  • Sessions : cookie_secure=true, cookie_samesite=strict

Frontend

  • Twig : templates, pas de framework JS Ă  gouverner
  • Stimulus (AssetMapper) : comportements JS ciblĂ©s
  • Bootstrap : composants UI
  • Choix dĂ©libĂ©rĂ©ment sobre : la qualitĂ© d'implĂ©mentation comme diffĂ©renciateur, pas le framework

Internationalisation

  • Traductions en translations/messages.fr.yaml et messages.en.yaml
  • Toutes les chaĂźnes UI passent par {{ 'key'|trans }} — aucune chaĂźne en dur dans les templates
  • Commandes Symfony : messages flash traduits via le mĂȘme mĂ©canisme

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 #