Konsep MVC (Model-View-Controller)

MVC adalah pola desain perangkat lunak (Architecture Pattern) yang memisahkan kode menjadi tiga bagian utama. Hampir semua framework web modern (termasuk Laravel) menggunakan konsep ini.

Kenapa Butuh MVC?

Sejauh ini, saat kita membuat file index.php atau tambah.php, kita mencampur 3 hal di dalam satu file:

  1. Kode akses ke database ($pdo->query(...))
  2. Logika program (Cek $_POST, validasi if-else)
  3. Tampilan HTML (<html>, <table>, foreach)

Cara ini disebut Spaghetti Code karena semuanya kusut bercampur. Jika websitenya membesar, kode akan sangat sulit dikelola.

1. Pemisahan Tugas (Separation of Concerns)

MVC menyelesaikan masalah tersebut dengan membagi tugas:

          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚             β”‚
          β”‚ Controller  │◄─────── Request dari Browser
          β”‚             β”‚
          β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
                 β”‚
                 β”‚
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚                     β”‚
   β”Œβ”€β”€β–Όβ”€β”€β”               β”Œβ”€β”€β–Όβ”€β”€β”
   β”‚     β”‚               β”‚     β”‚
   β”‚Modelβ”‚               β”‚View β”‚
   β”‚     β”‚               β”‚     β”‚
   β””β”€β”€β”¬β”€β”€β”˜               β””β”€β”€β”¬β”€β”€β”˜
      β”‚                     β”‚
β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
β”‚           β”‚       β”‚               β”‚
β”‚ Database  β”‚       β”‚ Tampilan HTML β”‚
β”‚           β”‚       β”‚               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. Model (Data / Database)

Tugasnya hanya berurusan dengan data.

  • Menyimpan query SQL.
  • Mengatur validasi ke database.
  • Contoh: User.php (Berisi fungsi untuk tambah user, hapus user, dll).

2. View (Tampilan / HTML)

Tugasnya hanya menampilkan antarmuka (User Interface).

  • Berisi tag HTML, CSS, JavaScript.
  • Tidak boleh ada query database di sini!
  • Contoh: index.html, tambah_user.php.

3. Controller (Otak / Pengatur Lalu Lintas)

Tugasnya menjadi perantara antara Model dan View.

  • Menerima request (klik tombol, input form) dari User.
  • Meminta data ke Model.
  • Mengirim data tersebut ke View untuk ditampilkan.
  • Contoh: UserController.php.

2. Analogi Restoran (Lagi) 🍽️

Ingat analogi restoran? Ini hubungannya dengan MVC:

Komponen MVCPeran di RestoranTugas
BrowserPelangganPesan makanan dari menu
ControllerPelayanMencatat pesanan, menyuruh koki memasak, lalu membawa makanan ke meja
ModelKoki DapurMenyiapkan bahan (database) dan memasak makanan
ViewPenataan PiringCara makanan dihidangkan agar cantik dilihat

Alur kerjanya:

  1. Pelanggan (Browser) pesan Nasi Goreng ke Pelayan (Controller).
  2. Pelayan menyuruh Koki (Model) untuk masak Nasi Goreng.
  3. Koki mengambil bahan dari kulkas (Database) dan selesai memasak.
  4. Pelayan menata makanan ke Piring (View) dan menyajikannya ke Pelanggan.

Piring tidak tahu cara memasak, koki tidak peduli makanan disajikan di piring warna apa. Masing-masing fokus pada tugasnya.

3. Ilustrasi MVC dalam Kode

Mari kita lihat bedanya kode Spaghetti vs MVC.

❌ Cara Lama (Spaghetti Code)

Satu file untuk semua.

<?php
// file: index.php
$pdo = new PDO("mysql:host=localhost;dbname=toko", "root", "");

// LOGIKA & DATABASE
$stmt = $pdo->query("SELECT * FROM produk");
$produk = $stmt->fetchAll();

// TAMPILAN
echo "<html><body><h1>Daftar Produk</h1><ul>";
foreach($produk as $p) {
    echo "<li>" . $p['nama'] . " - Rp " . $p['harga'] . "</li>";
}
echo "</ul></body></html>";

βœ… Cara Baru (Konsep MVC)

Tugas dipisah menjadi 3 bagian.

1. Model (ProdukModel.php)

<?php
class ProdukModel {
    private $pdo;
    
    public function __construct() {
        $this->pdo = new PDO("mysql:host=localhost;dbname=toko", "root", "");
    }
    
    public function getSemuaProduk() {
        $stmt = $this->pdo->query("SELECT * FROM produk");
        return $stmt->fetchAll();
    }
}

2. View (produk_view.php)

<html>
<body>
    <h1>Daftar Produk</h1>
    <ul>
        <?php foreach($data_produk as $p): ?>
            <li><?= $p['nama'] ?> - Rp <?= $p['harga'] ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

3. Controller (ProdukController.php)

<?php
require 'ProdukModel.php';

// 1. Menerima request
class ProdukController {
    
    public function index() {
        // 2. Minta data ke Model
        $model = new ProdukModel();
        $data_produk = $model->getSemuaProduk();
        
        // 3. Kirim data ke View untuk ditampilkan
        require 'produk_view.php';
    }
}

// Menjalankan controller
$controller = new ProdukController();
$controller->index();

Meskipun MVC terlihat membuat file lebih banyak, percayalah: Saat aplikasi web memiliki puluhan tabel dan ratusan halaman, arsitektur MVC akan menyelamatkan hidup (dan kewarasan) kamu sebagai developer.

Selanjutnya

Kita sudah tahu OOP dan MVC. Sebelum masuk ke Laravel, ada satu alat lagi yang wajib dikuasai untuk mengelola library PHP: Composer β†’.