Membedah filosofi Symfony: kombinasi komponen decoupled dengan framework full-stack, alur request/response lewat HttpKernel, pola MVC, Dependency Injection Container, Event Dispatcher, serta peran Flex recipes dalam menkonfigurasi project secara otomatis.

Setelah memahami sejarah Symfony di episode 1 — lahir sebagai proyek 2005 dengan model komponen reusable — pada episode ini kita membedah arsitektur internalnya: bagaimana sebuah request HTTP berubah menjadi response, dan komponen-komponen mana yang berperan di setiap tahap.
Mengapa arsitektur ini penting dipahami? Karena seluruh episode praktik berikutnya (routing di episode 4, DI di episode 8, security di episode 12) hanyalah cara memperkenalkan fitur ke dalam alur yang sama. Begitu kalian memahami peta jalan request/response, memahami setiap fitur Symfony menjadi jauh lebih mudah — kalian selalu tahu di lapisan mana suatu mekanisme bekerja.
Symfony menganut filosofi ganda yang jarang dimiliki framework lain:
| Pendekatan | Cocok untuk |
|---|---|
Komponen saja (mis. symfony/console) | CLI tool, micro-service, script internal |
| Full-stack (Symfony FrameworkBundle) | Aplikasi web/API yang besar dan terstruktur |
Filosofi ini membawa satu konsekuensi: konfigurasi cenderung eksplisit — tidak ada magic yang tersembunyi. Segala sesuatu (routing, service, security) didefinisikan lewat config atau attribute, dan bisa di-debug dengan perintah bin/console. Inilah yang membuat Symfony "predictable" untuk tim besar.
Inti arsitektur Symfony adalah HttpKernel: komponen yang mengubah Request (objek PHP mewakili HTTP request) menjadi Response. Alurnya kira-kira begini:
Tahapan kerjanya:
public/index.php memuat kernel aplikasi dan mengirim Request.Response.index.php hampir tidak pernah berubah — kalian bisa membukanya sekarang untuk melihat berapa banyak baris yang menangani seluruh aplikasi. Semua kecerdasan ada di framework, bukan di front controller.
Symfony adalah framework MVC: Controller (logika permintaan), Model (entitas/bisnis — dipegang Doctrine ORM), dan View (template — dipegang Twig). Peran tiap lapisan:
| Lapisan | Komponen | Tanggung jawab |
|---|---|---|
| Controller | AbstractController | Menerima request, memanggil service, mengembalikan response |
| Model | Doctrine Entity | Data, relasi, dan logika bisnis |
| View | Twig template | Rendering HTML/JSON dari data |
Pemisahan ini bukan aturan kosmetik: ia memungkinkan tim bekerja paralel (frontend merancang Twig, backend menulis service) dan memudahkan testing setiap lapisan secara independen.
Symfony adalah framework yang selalu ter-inject, tidak pernah instansiasi manual. Service container bertugas membuat dan mengelola objek (service) serta menyuntikkannya ke tempat yang membutuhkan. Ini memecahkan masalah nyata: alih-alih menulis new Mailer(...) di banyak tempat, kalian cukup mendeklarasikan satu service dan meminta container menyuntikkannya — otomatis (autowiring). Kita bedah penuh di episode 8.
Symfony memakai pola event-driven: framework dan bundle mengirim events pada titik-titik tertentu (request masuk, exception, response keluar, cache invalidate), dan subscriber bisa "mendengarkan" lalu menjalankan logika tambahan. Contoh nyata: sebelum menghitung Response, listener logging mencatat waktu; saat Response keluar, listener security menambahkan header. Ini fondasi dari banyak fitur yang dibahas sepanjang series (misal listener security headers di episode 18).
Berikut komponen yang akan menemani kita sepanjang series:
| Komponen | Peran | Episode |
|---|---|---|
| HttpKernel | Alur request/response | 2 |
| Routing | Pemetaan URL ke controller | 4 |
| Twig | Templating | 5 |
| Doctrine ORM | Database & entity | 6 |
| Form / Validator | Input & validasi | 7 |
| DependencyInjection | Service container | 8 |
| Console | CLI commands | 9 |
| Messenger | Queue & async | 10 |
| HttpClient | HTTP keluar | 11 |
| Security | AuthN & AuthZ | 12 |
Satu mekanisme yang membuat Symfony 4+ terasa "magis" adalah Symfony Flex: ia mengganti cara install bundle lama dengan konsep recipes. Saat kalian menjalankan composer require api, Flex memilih recipe yang sesuai (project tipe webapp/skeleton), lalu secara otomatis menambahkan konfigurasi, bundle, dan file yang dibutuhkan:
composer require doctrine/orm
composer require api
composer require --dev symfony/maker-bundleSetiap perintah di atas memodifikasi config/packages/, config/bundles.php, dan composer.json tanpa kalian menyentuh apa pun secara manual. Recipes inilah yang membuat setup Symfony terasa modern dibandingkan versi 2-3 yang harus dikonfigurasi manual baris demi baris.
Tip
Karena Flex bekerja berdasarkan tipe project, biasakan membedakan dua distribusi resmi: symfony/skeleton (minimal, untuk API/CLI) dan symfony/webapp (lengkap dengan Doctrine, Twig, Security, dll). Kita bahas keduanya di episode 3.
Pada episode 2 ini, kalian telah memahami kerangka berpikir arsitektur Symfony.
Inti yang harus dibawa pulang:
Request masuk, controller dipanggil, Response keluar.Di episode 3 selanjutnya, kita mulai praktik nyata: membuat project Symfony pertama, memahami struktur direktori (src/, config/, templates/, migrations/, public/), menjalankan server dev, dan mengenal bin/console. Sampai jumpa di episode 3!