# Architecture Symfony

## Bundles

Chamilo 2.0 est structuré en trois bundles Symfony :

### CoreBundle (`src/CoreBundle/`)

Le plus grand bundle, gérant toutes les préoccupations à l'échelle de la plateforme :

* **Utilisateurs et authentification** — Entité Utilisateur, rôles, jetons JWT, fournisseurs OAuth2
* **Système de ressources** — ResourceNode et ResourceFile (l'abstraction unifiée du contenu)
* **Paramètres de la plateforme** — Schémas de paramètres dans `src/CoreBundle/Settings/` couvrant tous les aspects configurables
* **Administration** — Contrôleurs d'administration pour la gestion des utilisateurs, des cours, des sessions et des plugins
* **Fournisseurs d'IA** — Modèle de fabrique pour OpenAI, Gemini, Mistral, DeepSeek, Grok
* **Stockage de fichiers** — Adaptateurs de stockage basés sur Flysystem (local, S3, Azure, GCS)
* **Sécurité** — Voters, contrôle d'accès, hiérarchie des rôles
* **Outils** — Définitions des outils de cours enregistrés via le système d'outils

### CourseBundle (`src/CourseBundle/`)

Tout ce qui est spécifique au contenu des cours :

* **Entités de contenu** — 101 entités pour les documents, exercices, parcours d'apprentissage, forums, glossaires, sondages, présences, blogs, devoirs, et plus encore
* **Copie de cours** — Import/export avec prise en charge des formats Common Cartridge 1.3 et Moodle
* **Paramètres de cours** — Schémas de paramètres au niveau des cours

### LtiBundle (`src/LtiBundle/`)

Implémentation de la norme LTI 1.3 :

* **Enregistrement de plateforme et d'outil** — Gestion des connexions aux outils externes
* **Gestion des lancements** — Contrôleurs de flux de lancement LTI
* **Retour des notes** — Renvoi des notes des outils externes vers Chamilo

## Conteneur de services

Chamilo utilise le conteneur d'injection de dépendances de Symfony. Les services sont configurés dans :

* `config/services.yaml` — Définitions des services globaux
* Le répertoire `DependencyInjection/` de chaque bundle — Services spécifiques aux bundles

## Architecture de sécurité

Le système de sécurité est configuré dans `config/packages/security.yaml` :

* **Hachage des mots de passe** — Prend en charge bcrypt (par défaut), avec migration depuis les anciens SHA1 et MD5
* **Hiérarchie des rôles** — 18 rôles organisés hiérarchiquement (ROLE\_GLOBAL\_ADMIN > ROLE\_ADMIN > ROLE\_TEACHER > ROLE\_STUDENT > ROLE\_USER ; rôles supplémentaires incluant ROLE\_HR, ROLE\_INVITEE, ROLE\_STUDENT\_BOSS, ROLE\_SESSION\_MANAGER, ROLE\_QUESTION\_MANAGER)
* **Rôles sensibles au contexte** — Rôles au niveau des cours (ROLE\_CURRENT\_COURSE\_TEACHER, ROLE\_CURRENT\_COURSE\_STUDENT) calculés par requête en fonction de l'inscription
* **Pare-feu** — Authentification JWT pour l'API, basée sur session pour l'interface web
* **Voters** — Contrôle d'accès au niveau des ressources via les voters de Symfony

## Code legacy

Certaines fonctionnalités utilisent encore du code PHP legacy dans `public/main/` :

* Rendu et interaction des exercices
* Lecteur de parcours d'apprentissage
* Certains outils d'administration

Ces éléments sont progressivement migrés vers l'architecture Symfony+Vue. Les pages legacy sont servies via une couche de compatibilité qui initialise le noyau Symfony.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chamilo.org/chamilo-2-francais/guide-du-developpeur/developer-guide/backend/symfony-architecture.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
