Membedah arsitektur Model-View-Controller CodeIgniter 4, bagaimana satu request mengalir dari index.php melewati routing menuju controller, serta memahami struktur folder app/ public/ writable/ dan peran services, helpers, dan libraries dalam siklus hidup aplikasi.

Setelah di episode 1 kita memahami sejarah CodeIgniter — dari framework 2006 EllisLab hingga rewrite modern CI4 yang dikelola BCIT — pada episode ini kita membedah arsitektur inti yang menjadi tulang punggung semua project CodeIgniter: MVC (Model-View-Controller) dan struktur folder standarnya.
Mengapa ini penting? Karena semua episode berikutnya — routing, view, model, filter — berputar di sekitar konsep ini. Kalau kalian paham ke mana file ditaruh dan bagaimana request mengalir, maka ketika error terjadi kalian tahu persis harus mengecek di mana. Ini keterampilan yang paling membedakan developer yang "tinggal jalan" dan developer yang benar-benar menguasai framework-nya.
MVC memisahkan tiga tanggung jawab utama aplikasi web:
| Komponen | Tanggung Jawab | Di CodeIgniter |
|---|---|---|
| Model | Logika data: ambil, simpan, ubah, hapus dari database | app/Models/, extends CodeIgniter\Model |
| View | Menampilkan data: HTML, layout, partial | app/Views/, dipanggil via view() |
| Controller | Orkestrasi: terima request, validasi, panggil model, render view | app/Controllers/ |
Bayangkan sebuah restoran: Controller adalah pelayan yang menerima pesanan dari pelanggan (request), Model adalah dapur yang mengelola bahan dan menyiapkan hidangan (data), dan View adalah tampilan akhir yang disajikan ke meja (response HTML). Pelayan tidak memasak, dapur tidak melayani pelanggan — masing-masing fokus pada satu pekerjaan.
public/index.php.Saat composer create-project selesai, kalian akan menemukan struktur berikut:
ci4-app/
├── app/ # Kode aplikasi kalian (kode utama)
│ ├── Config/ # Konfigurasi: Routes, Database, App, Filters, dll
│ ├── Controllers/ # Controller MVC
│ ├── Database/ # Migrations & Seeds
│ ├── Filters/ # Middleware (before/after request)
│ ├── Helpers/ # Helper custom
│ ├── Language/ # File terjemahan
│ ├── Libraries/ # Library custom
│ ├── Models/ # Model MVC
│ ├── Views/ # View MVC (HTML)
│ └── ThirdParty/ # Library pihak ketiga non-Composer
├── public/ # Satu-satunya folder yang diekspos web server
│ ├── index.php # Front controller
│ └── .htaccess # Rule Apache
├── writable/ # Bisa ditulis runtime (logs, cache, upload, session)
├── tests/ # Unit & feature test (PHPUnit)
├── vendor/ # Dependency Composer
├── env # Template file .env
├── composer.json
└── spark # CLI binary CodeIgniterpublic/ yang Diekspos?Ini keputusan keamanan paling penting: web server hanya mengarahkan document root ke public/. Artinya app/, vendor/, dan .env tidak pernah bisa diakses langsung dari browser. Kalian akan melihat detail hardening ini di episode 16 dan 18 — untuk sekarang, ingat aturan emasnya: jangan pernah mengarahkan document root ke root project.
writable/: Area RuntimeFolder writable/ adalah satu-satunya tempat framework menulis: file log (writable/logs/), cache, session file, dan upload. Karena itu folder ini harus memiliki permission tulis oleh user PHP-FPM/web server — di episode 23 kita akan mengatur ini di Docker dengan chown khusus.
CodeIgniter 4 memperkenalkan services — class yang menyediakan objek siap pakai seperti database, session, cache, dan response. Prinsipnya: jangan new langsung, minta ke services agar singleton & mudah dimodifikasi.
$db = \Config\Database::connect();
$session = \Config\Services::session();
$cache = \Config\Services::cache();
$response = \Config\Services::response();\Config\Services::session() mengembalikan objek session yang sudah dikonfigurasi — kalian tidak perlu mengatur driver, save path, dan cookie name secara manual. Services juga bisa diperluas: di episode 10 kita akan mendaftarkan library custom sebagai service.
Dua istilah yang sering membingungkan pemula:
site_url(), form_open(), esc(), set_value(). Dimuat via helper('url').new atau services.Aturan praktis: fungsi sekali pakai di seluruh view/controller → helper; logika yang menyimpan state atau punya banyak method → library. Kita praktikkan keduanya di episode 10.
index.php → Routes → Controller → Model → View → response.public/ yang diekspos web server; sisanya privat.writable/ adalah area runtime: logs, cache, session, upload.Inti yang harus dibawa pulang:
index.php → routing → controller → model → view → response.app/, public/, writable/ punya peran dan aturan keamanan masing-masing.Di episode 3 selanjutnya kita akan menginstall CodeIgniter 4 secara nyata — menjalankan composer create-project codeigniter4/appstarter, menyiapkan .env, membuat hello world pertama, dan membedakan environment development vs production. Pastikan Composer dan PHP kalian sudah siap, karena hands-on dimulai sekarang!