Cara Membangun Framework MVC PHP Sendiri dari Nol

Membangun framework Model-View-Controller (MVC) PHP dari nol memerlukan pemahaman mendalam tentang pola desain perangkat lunak, mekanisme routing berbasis URL, serta pemisahan logika bisnis dari antarmuka pengguna. Pendekatan ini menghilangkan ketergantungan pada pustaka pihak ketiga dan memberikan kontrol penuh atas performa aplikasi web.

Arsitektur MVC membagi aplikasi ke dalam tiga komponen utama: Model yang menangani interaksi database dan aturan data, View yang memproses tampilan HTML/CSS, serta Controller yang bertindak sebagai penengah untuk memproses permintaan pengguna dari router dan memanggil model yang sesuai.

Struktur Direktori Proyek MVC PHP

Langkah awal pembangunan framework adalah menetapkan struktur folder yang bersih dan terstandarisasi. Struktur ini memisahkan direktori publik yang dapat diakses browser dari inti sistem kode sumber (source code) guna menjaga keamanan aplikasi.

Direktori / File Fungsi Utama dalam Framework
/app/controllers/ Menyimpan kelas pengendali untuk memproses logika permintaan HTTP.
/app/models/ Menyimpan kelas entitas dan logika komunikasi basis data.
/app/views/ Menyimpan berkas antarmuka pengguna (template HTML).
/core/ Berisi mesin inti framework seperti App.php, Controller.php, dan Database.php.
/public/ Titik masuk utama aplikasi (Document Root), berisi index.php dan aset statis.
.htaccess Konfigurasi Apache untuk mengarahkan seluruh URL ke public/index.php.

Implementasi Komponen Inti (Core Engine)

Mesin inti bertanggung jawab untuk menangkap URL melalui teknik URL Rewriting, memecahnya menjadi parameter controller, method, dan argumen, lalu mengeksekusinya secara dinamis.

1. Konfigurasi Apache .htaccess

Letakkan berkas ini di root direktori proyek untuk memastikan semua permintaan dialihkan ke folder public:

<IfModule mod_rewrite.c>
    Options -Multiviews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

2. Titik Masuk (public/index.php)

Berkas ini menginisialisasi sesi, memuat konfigurasi utama, dan memanggil kelas inti aplikasi:

<?php
if(!session_id()) session_start();

require_once '../core/App.php';
require_once '../core/Controller.php';
require_once '../core/Database.php';

$app = new App();

3. Kelas Router & Pemohon (core/App.php)

Kelas ini membaca URL, memisahkan segmen, dan memuat kelas controller yang sesuai secara otomatis:

<?php
class App {
    protected $controller = 'Home';
    protected $method = 'index';
    protected $params = [];

    public function __construct() {
        $url = $this->parseURL();

        // Cek Controller
        if(isset($url[0]) && file_exists('../app/controllers/' . ucfirst($url[0]) . '.php')) {
            $this->controller = ucfirst($url[0]);
            unset($url[0]);
        }

        require_once '../app/controllers/' . $this->controller . '.php';
        $this->controller = new $this->controller;

        // Cek Method
        if(isset($url[1])) {
            if(method_exists($this->controller, $url[1])) {
                $this->method = $url[1];
                unset($url[1]);
            }
        }

        // Kelola Parameter
        if(!empty($url)) {
            $this->params = array_values($url);
        }

        // Jalankan Controller & Method dengan parameter
        call_user_func_array([$this->controller, $this->method], $this->params);
    }

    public function parseURL() {
        if(isset($_GET['url'])) {
            $url = rtrim($_GET['url'], '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = explode('/', $url);
            return $url;
        }
        return [];
    }
}

4. Kelas Controller Dasar (core/Controller.php)

Controller dasar menyediakan metode pembantu untuk memuat tampilan (view) dan model:

<?php
class Controller {
    public function view($view, $data = []) {
        if(file_exists('../app/views/' . $view . '.php')) {
            extract($data);
            require_once '../app/views/' . $view . '.php';
        } else {
            die("View tidak ditemukan.");
        }
    }

    public function model($model) {
        if(file_exists('../app/models/' . $model . '.php')) {
            require_once '../app/models/' . $model . '.php';
            return new $model;
        } else {
            die("Model tidak ditemukan.");
        }
    }
}

Langkah Pengujian dan Troubleshooting

Setelah komponen inti selesai, buat controller uji coba di app/controllers/Home.php dengan metode index() yang memanggil fungsi $this->view('home/index'). Pastikan modul mod_rewrite pada peladen web Apache telah diaktifkan jika mengalami galat 404 pada URL sub-halaman.