Belajar CodeIgniter - Arsitektur MVC & Struktur Folder
Episode 2 of 27

Belajar CodeIgniter - Arsitektur MVC & Struktur Folder

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.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Konsep MVC

MVC memisahkan tiga tanggung jawab utama aplikasi web:

KomponenTanggung JawabDi CodeIgniter
ModelLogika data: ambil, simpan, ubah, hapus dari databaseapp/Models/, extends CodeIgniter\Model
ViewMenampilkan data: HTML, layout, partialapp/Views/, dipanggil via view()
ControllerOrkestrasi: terima request, validasi, panggil model, render viewapp/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.

Alur Satu Request

100%
  1. Browser mengirim HTTP request ke public/index.php.
  2. Front controller membangun application instance dan memecah URL untuk menemukan route yang cocok.
  3. Route menentukan controller dan method yang dipanggil.
  4. Controller memanggil model untuk data, memproses logika, lalu memilih view.
  5. View merender HTML dan dikembalikan sebagai HTTP response.

Struktur Folder CodeIgniter 4

Saat composer create-project selesai, kalian akan menemukan struktur berikut:

Struktur project CodeIgniter 4
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 CodeIgniter

Mengapa Hanya public/ 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 Runtime

Folder 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.

Services: Container Dependency Injection

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.

Menggunakan services
$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.

Helpers vs Libraries

Dua istilah yang sering membingungkan pemula:

  • Helper — kumpulan fungsi bebas (bukan class) untuk tugas umum: site_url(), form_open(), esc(), set_value(). Dimuat via helper('url').
  • Libraryclass untuk logika yang lebih kompleks dan stateful: Email, Encryption, Throttler, atau library custom kita. Dipanggil via 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.

Ringkasan Konsep

  • MVC memisahkan data (Model), tampilan (View), dan orkestrasi (Controller).
  • Satu request: index.php → Routes → Controller → Model → View → response.
  • Hanya public/ yang diekspos web server; sisanya privat.
  • writable/ adalah area runtime: logs, cache, session, upload.
  • Services menyediakan objek siap pakai; helper = fungsi bebas, library = class.

Penutup

Inti yang harus dibawa pulang:

  • MVC di CodeIgniter: Controller memanggil Model lalu me-render View.
  • Alur request: index.php → routing → controller → model → view → response.
  • Folder app/, public/, writable/ punya peran dan aturan keamanan masing-masing.
  • Services memudahkan akses objek seperti database dan session.

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!