# Arsitektur Symfony

## Bundle

Chamilo 2.0 terstruktur dalam tiga bundle Symfony:

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

Bundle terbesar, bertanggung jawab atas semua aspek yang mencakup platform:

* **Pengguna dan autentikasi** — Entitas pengguna, peran, token JWT, penyedia OAuth2
* **Sistem sumber daya** — ResourceNode dan ResourceFile (abstraksi terpadu dari konten)
* **Pengaturan platform** — Skema pengaturan di `src/CoreBundle/Settings/` yang mencakup semua aspek yang dapat dikonfigurasi
* **Administrasi** — Pengontrol administrasi untuk pengelolaan pengguna, kursus, sesi, dan plugin
* **Penyedia AI** — Pola Factory untuk OpenAI, Gemini, Mistral, DeepSeek, Grok
* **Penyimpanan berkas** — Adaptor penyimpanan berbasis Flysystem (lokal, S3, Azure, GCS)
* **Keamanan** — Voters, kontrol akses, hierarki peran
* **Alat** — Definisi alat kursus yang terdaftar oleh sistem alat

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

Semua yang berkaitan dengan konten kursus:

* **Entitas konten** — 101 entitas untuk dokumen, latihan, jalur pembelajaran, forum, glosarium, jajak pendapat, kehadiran, blog, tugas, dan lainnya
* **Salinan kursus** — Impor/ekspor dengan dukungan format Common Cartridge 1.3 dan Moodle
* **Pengaturan kursus** — Skema pengaturan pada tingkat kursus

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

Implementasi standar LTI 1.3:

* **Registrasi platform dan alat** — Pengelolaan koneksi dengan alat eksternal
* **Pengelolaan peluncuran** — Pengontrol alur peluncuran LTI
* **Pengembalian nilai** — Pengiriman nilai dari alat eksternal ke Chamilo

## Kontainer Layanan

Chamilo menggunakan kontainer injeksi dependensi dari Symfony. Layanan dikonfigurasi di:

* `config/services.yaml` — Definisi layanan global
* Direktori `DependencyInjection/` pada setiap bundle — Layanan khusus untuk setiap bundle

## Arsitektur Keamanan

Sistem keamanan dikonfigurasi di `config/packages/security.yaml`:

* **Hash kata sandi** — Mendukung bcrypt (default), dengan migrasi dari SHA1 dan MD5 lama
* **Hierarki peran** — 18 peran yang diatur secara hierarkis (ROLE\_GLOBAL\_ADMIN > ROLE\_ADMIN > ROLE\_TEACHER > ROLE\_STUDENT > ROLE\_USER; peran tambahan meliputi ROLE\_HR, ROLE\_INVITEE, ROLE\_STUDENT\_BOSS, ROLE\_SESSION\_MANAGER, ROLE\_QUESTION\_MANAGER)
* **Peran sensitif konteks** — Peran pada tingkat kursus (ROLE\_CURRENT\_COURSE\_TEACHER, ROLE\_CURRENT\_COURSE\_STUDENT) dihitung per permintaan berdasarkan pendaftaran
* **Firewall** — Autentikasi JWT untuk API, berbasis sesi untuk antarmuka web
* **Voters** — Kontrol akses pada tingkat sumber daya melalui voters Symfony

## Kode Lama

Beberapa fitur masih menggunakan kode PHP lama di `public/main/`:

* Rendering dan interaksi latihan
* Pemutar jalur pembelajaran
* Beberapa alat administrasi

Fitur-fitur ini secara bertahap dimigrasikan ke arsitektur Symfony+Vue. Halaman lama disajikan melalui lapisan kompatibilitas yang menginisialisasi kernel 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/2.x-id/panduan-pengembang/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.
