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.