Pengenalan konsep MVC pada PHP

Muhammad Pandu Royyan
Amikom Computer Club
12 min readApr 26, 2024

Halo halo 👋, gimana nih libur lebarannya sudah puas belum? kalau sudah kita lanjut pelatihan lagi yuk!. Pada pelatihan ke-tujuh ini kita akan mengupas tuntas apa itu MVC dan bagaimana cara kerjanya. MVC merupkan fundamental sebelum kita mempelajari Laravel. “Kenapa kita harus belajar MVC kak? kenapa gak langsung belajar Laravel”, Seperti yang sudah dibilang di awal tadi, MVC merupakan fundamental dari Laravel, karena Laravel dibalik layar menggunakan konsep MVC ini. Jadi dengan kita memahami cara kerja dari MVC maka dapat dipastikan kita dapat lebih mudah mempelajari Laravel kedepannya. Maka dari itu pastikan kalian memahami modul kali ini sebelum kita memasuki Laravel pada pertemuan berikutnya.

Table Of Contents

· Composer
Instalasi composer
Membuat project composer
· Apa itu MVC
· Framework MVC
Struktur direktori
Composer autoload
Model
View
Controller
Router
· Implementasi MVC dengan Todolist App
Membuat model
Membuat view
Membuat controller
Menambahkan route

Composer

Composer merupakan dependency management tool milik PHP. Dengan menggunakan composer maka akan memudahkan kita untuk me-manage dependensi seperti misalnya menambah, menghapus mengubah versi dan sebagainya. Selain itu composer juga mempunyai fitur autoload yang akan kita pakai pada projek kali ini. Fitur autoload memungkinkan untuk me-load file secara otomatis jadi tidak perlu require satu persatu. Jika kamu menggunakan Laragon kamu bisa skip step ini, karena Laragon sudah terinstall composer secara default. Kamu bisa membuktikannya dengan cara membuka terminal milik laragon lalu ketikkan composer

Instalasi composer

Jika kamu menggunakan XAMPP maka kamu harus menginstall composer secara manual, tapi tenang saja untuk instalasi composer ini sangat mudah kamu bisa langsung download file installer melalui link berikut ini Composer-Installer. Setelah itu buka installer maka akan ada tampilan seperti berikut ini lalu klik next

Setelah itu kamu akan diminta menentukan lokasi dari php.exe , file ini berada di lokasi instalasi XAMPP maka dari itu sesuaikan dengan lokasi instalasi kalian masing masing

Setelah itu kamu bisa klik next-next saja sampai instalasi selesai. Setelah selesai, buka command prompt lalu ketikkan composer jika muncul informasi detail tentang composer makan instalasi telah berhasil

Membuat project composer

Untuk membuat project composer sangat mudah sekali caranya dengan satu command saja yaitu composer init . Tapi sebelum itu pastikan kalian telah membuat folder, jika menggunakan XAMPP maka buat folder didalam htdocs jika menggunakan Laragon buat didalam folder www . Setelah itu buka command prompt jika menggunakan XAMPP atau buka terminal bawaan Laragon, pastikan path-nya sudah berada didalam folder yang barusan dibuat. Jika belum kalian bisa menggunakan command cd untuk mengarahkan ke folder yang barusan dibuat

Setelah menjalankan command composer init kamu akan diminta untuk mengisi data terkait project composer kamu, sesuaikan saja ya!

Setelah itu maka akan ada file baru bernama composer.json . Selamat kamu telah membuat project composer sebenarnya penggunaan composer masih banyak lagi namun karena materi ini berfokus membahas MVC dan kita hanya menggunakan fitur autoload pada composer maka pembahasan tentang composer cukup sampai sini kalian bisa ngulik diluar materi ini

Apa itu MVC

MVC merupakan sebuah software design pattern yang sering digunakan untuk mengembangakan aplikasi berbasis user interface seperti misalnya pengembangan web. MVC merupakan singkatan dari Model-View-Controller, sesuai dengan namanya MVC dibagi menjadi tiga komponen utama yaitu, yang pertama Model, model berfungsi untuk mengelola data aplikasi. Model biasanya berinteraksi dengan database atau sumber data lainnya untuk mengambil, menyimpan, dan memanipulasi data. Model juga bisa di representasikan sebagai entitas suatu data di database seperti misalnya table dan data di dalamnya. Komponen yang kedua yaitu View, view merupakan bagian yang merepresentasikan tampilan seperti misalnya tampilan pada halaman web. Komponen yang ketiga adalah Controller, controller merupakan bagian terpenting dari MVC. Controller bertugas untuk mengurus alur kerja dari menerima request yang dibuat oleh user lalu mengolah data model hingga menampilkan hasil menggunakan view

Framework MVC

Untuk memahami lebih lanjut tentang MVC kita akan menggunakan langsung framework MVC sederhana dan melihat bagaimana cara MVC bekerja di balik layar. Kamu bisa download framework melalui github repository ini, setelah itu ekstrak dan pindahkan ke folder htdocs jika menggunakan XAMPP atau www jika menggunakan Laragon. Jika sudah lalu akses melalui localhost/<nama-folder> kalau masih belum menampilkan halaman welcome, tambahkan /public pada akhir url sehingga hasilnya seperti ini localhost/<nama-folder>/public

Gambar diatas merupakakan flow atau alur kerja dari framework MVC. Dimulai dari user yang melakukan request melalui web browser, lalu request tersebut akan di handle oleh komponen yang bernama Route. Route akan memilih controller dan method mana yang akan dipilih untuk meng-handle request sesuai dengan url. Misal url-nya / maka controllernya HomeController dan methodnya index atau jika url-nya /about maka controllernya adalah HomeController dan methodnya about , hal inilah yang dinamakan routing. Setelah controller terpilih maka controller tersebut akan mengolah request dari user seperti misalnya mengubah, menambah, menghapus data di database melalui Model atau bisa menampilkan halaman menggunakan View

Struktur direktori

Ada empat folder utama dalam framework ini, yang pertama public, public merupakan folder yang bisa dikases oleh siapa saja lalu didalam folder ini terdapat file index.php yang akan menjadi entrypoint atau pintu masuk ke aplikasi, untuk entrypoint ini kita akan bahas lebih lanjut di bab selanjutnya. Folder yang kedua adalah src, didalam folder inilah semua aplikasi kita disimpan seperti misalnya konfigurasi database, controller, model dan sebagainya. Selanjutnya adalah vendor, folder ini tidak dibuat secara manual melainkan secara otomatis jika menggunkan composer autoload, folder ini juga akan menyimpan dependensi yang digunakan pada framework ini. Yang terakhir yaitu views, folder ini menyimpan tampilan dari web kita, seperti misalnya halaman welcome , about us , login dan sebagainya.

Composer autoload

"autoload": {
"psr-4": {
"AMCC\\MVC\\": "src"
}
}

Untuk menggunakan autoload kita harus melakukan konfigurasi di file composer.json . Pada kode diatas kita melakukan konfigurasi agar semua file yang ada di folder src dapat di autoload. File dapat di autoload dengan syarat namespace harus diawali dengan AMCC\MVC dan nama folder harus sesuai dengan nama namespace, misal file yang berada di folder controller maka namespace-nya harus AMCC\MVC\Controller

index.php (entrypoint)

Pada file index.php kita memanggil file autoload yang berguna untuk me-load file otomatis jadi tidak perlu memanggil file satu persatu cukup panggil dengan namespacenya saja seperti diatas use AMCC\MVC\Route\Router . File index.php merupakan entrypoint dari aplikasi kita, jadi sebenarnya semua request yang masuk hasilnya akan di tampilkan di index.php , tampilannya berbeda beda karena sudah di konfigurasi menggunakan router. Pembahasan tentang router akan dibahas di bab selanjutnya

Model

class Mahasiswa
{
public $nama;
public $nim;

public function __construct($nama, $nim)
{
$this->nama = $nama;
$this->nim = $nim;
}
}

Seperti yang sudah dijelaskan diatas, Model adalah representasi data atau sebuah entitas. Pada file src/model/Mahasiswa.php adalah model yang merepresentasikan entitas mahasiswa. Model tersebut masih statis belum terhubung dengan database tapi pada bab selanjutnya kita akan implementasi model yang terhubung dengan database

View

Pada framework ini terdapat dua folder view yaitu src/view dan views . Folder src/view berisi kumpulan class yang berfungsi untuk me-load file tampilan yang berada di folder views . Pada file Page.php terdapat class Page yang mempunyai static function render . Static function inilah yang akan kita pakai untuk me-load file tampilan di controller

Controller

class HomeController
{
public function index()
{
Page::render('welcome_page', [
'nama' => 'Member Backend',
]);
}

public function about()
{
Page::render('about_page');
}

public function listMahasiswa()
{
$data = [
new Mahasiswa('Ahmad Basikal', '22.99.9999'),
new Mahasiswa('Tulung Agung', '22.77.7777'),
];

Page::render('list_mahasiswa', [
'mahasiswa' => $data,
]);
}
}

Bisa dibilang controller merupakan inti dari MVC, karena pada controller inilah semua logika kita berada seperti misalnya manipulasi data dengan model dan memilih tampilan mana yang ingin ditampilkan dengan View. Pada framework ini sudah ada satu controller yang tersedia yaitu HomeController , didalam controller ini terdapat tiga method yaitu index , about , listMahasiswa . Method inilah yang akan di render di entrypoint yaitu index.php . Method juga merupakan representasi dari halaman itu sendiri semisal untuk halaman About dengan url /about maka akan menjalankan method about .

Router

Sesuai dengan namanya, fungsi dari router adalah membuat rute. Rute yang dimaksud disini adalah rute untuk mengarahkan request ke method controller berdasarkan url. Misalkan user mengkases /about maka Router akan akan mencari controller serta method yang terdaftar untuk url /about , jika ada jalankan method controller tersebut.

public static function add(string $requestMethod, string $path, string $controller, string $method)
{
// kita simpan route kedalam variabel $routes
// karena variabel $routes adalah static maka kita membutuhkan keyword self untuk mengaksesnya
self::$routes[] = [
'requestMethod' => $requestMethod,
'path' => $path,
'controller' => $controller,
'method' => $method,
];
}

Pada src/route/Router.php terdapat class Router , class ini memiliki dua static method yaitu add dan run . Method add berfungsi untuk menambahkan rute, rute yang ditambahkan akan disimpan di variabel routes yang dimana kita akan gunakan di method run nantinya. Method add ini membutuhkan empat parameter yaitu request method seperti GET , POST , lalu path atau url seperti misalnya /about lalu ada controller disini kita menentukan controller mana. Controller harus ditulis dengan namespacenya misal AMCC\MVC\Controller\HomeController . Dan yang terakhir adalah method dari controller tersebut misal about . Jadi hasil akhirnya nanti akan disimpan dalam bentuk array asosiatif ['requestMethod' => 'GET', 'path' => '/about', 'controller' => 'AMCC\MVC\Controller\HomeController', 'method' => 'about'] .

public static function run()
{
$path = '/'; // default path
$requestMethod = $_SERVER['REQUEST_METHOD'];
if (isset($_SERVER['PATH_INFO'])) {
// cek apakah variabel global $_SERVER['PATH_INFO'] mempunyai nilai
// variabel global $_SERVER['PATH_INFO'] menyimpan info path yang sedang kita akses
// misalnya /category, /product dan lain lain
$path = $_SERVER['PATH_INFO']; // jika ada maka timpa default path dengan yang baru
}

// lakukan perulangan untuk mencari route yang sesuai dengan path dan request method
foreach (self::$routes as $route) {
if ($route['path'] === $path && $route['requestMethod'] === $requestMethod) {

// buat instance controller yang tersimpan di $routes
$controller = new $route['controller'];

// ambil method yang tersimpan di $routes
// kita gunakan untuk memanggil method dari suatu controller
$method = $route['method'];

// panggil method milik controller
$controller->$method();

return; // return untuk menghentikan perulangan
}
}
}

Method run inilah dimana rute akan di ekseskusi jika memenuhi kondisi. Kondisi yang dimksud adalah path dan request method-nya harus sama dengan yang ada di global variabel $_SERVER . Jika semua kondisi terpenuhi maka buat instance controller yang sebelumnya kita tambahakan di rute setelah itu panggil method milik controller tersebut

entrypoint (index.php)

Pada entrypoint atau index.php kita menambahkan rute menggunakan method add, seperti pada gambar diatas. Lalu jangan lupa untuk memanggil method run untuk menjalankan router

Implementasi MVC dengan Todolist App

Agar memahami lebih lanjut tentang bagaimana MVC bekerja kita akan coba implementasi Todolist App yang sudah kita buat pada pertemuan sebelumnya menggunakan framework MVC. Pastikan kalian telah membuat database todolistnya, jika belum maka harus buat baru melalui phpmyadmin setelah itu copy script yang ada di url ini dan paste pada bagian SQL di ditabase yang barusan dibuat.

Membuat model

Seperti yang dikatakan di awal tadi, kita akan membuat model yang terhubung dengan database jadi langkah pertama kita adalah konfigurasi database. Konfigurasi terletak di src/config/Database.php , sesuaikan username , password dan nama database kalian masing masing. Setelah itu buat model Todo dengan cara buat file baru di folder src/model lalu beri nama Todo.php setelah itu paste kode dibawah ini kedalam file yang barusan dibuat

<?php

namespace AMCC\MVC\Model;

use AMCC\MVC\Config\Database;

class Todo
{
public $id;
public $user_id;
public $todo;
public $status;

public function __construct($id, $todo, $status = false, $user_id = null)
{
$this->id = $id;
$this->user_id = $user_id;
$this->todo = $todo;
$this->status = $status;
}

public static function getAllTodos()
{
$results = Database::getConnection()->query('SELECT * FROM lists')
->fetch_all(MYSQLI_ASSOC);

$todos = [];
foreach ($results as $result) {
$todo = new Todo($result['id'], $result['todo'], $result['status'], $result['user_id']);
array_push($todos, $todo);
}

return $todos;
}
}

Pada model Todo terdapat static method getAllTodos . Method ini berfungsi untuk mengambil todo dari database. Pertama tama kita buat koneksi dulu menggunakan static method getConnection milik class Database lalu query semua todo dan simpan ke variabel $results . Variable $results kita foreach lalu hasilnya kita jadikan instance object todo baru hal inilah yang dinamakan dengan mapping . Setelah itu instance object todo yang baru dibuat kita masukkan ke array $todos menggunakan fungsi bawaan PHP yaitu array_push . Setelah perulangan selesai kita return array $todos . Kita akan gunakan method getAllTodos ini di controller nantinya

Membuat view

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Todolist</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<div class="w-4/5 sm:w-3/5 mx-auto mt-10">
<h3 class="text-3xl md:text-4xl text-center font-bold mb-5">
Todolist App
</h3>
<form action="./create.php" method="POST" class="flex space-x-4 mb-4">
<input
type="text"
id="todo"
name="todo"
aria-describedby="helper-text-explanation"
class="bg-gray-50 basis-3/4 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5"
placeholder="Todo"
/>
<button
type="submit"
class="text-white basis-1/4 bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center"
>
Tambah Todo
</button>
</form>
<div class="relative overflow-x-auto shadow-md sm:rounded-lg">
<table class="w-full text-sm text-left rtl:text-right text-gray-500">
<thead class="text-xs text-gray-700 uppercase bg-gray-50">
<tr>
<th scope="col" class="px-6 py-3">Todo</th>
<th scope="col" class="px-6 py-3">Status</th>
<th scope="col" class="px-6 py-3">Aksi</th>
</tr>
</thead>
<tbody>
<?php foreach ($todos as $todo): ?>
<tr class="odd:bg-white even:bg-gray-50 border-b">
<th
id="list-<?=$todo->id?>"
scope="row"
class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap <?php echo $todo->status > 0 ? 'line-through' : ''; ?>"
>
<?php echo $todo->todo ?>
</th>
<td class="px-6 py-4">
<input
<?php echo $todo->status > 0 ? 'checked' : ''; ?>
type="checkbox"
onchange="checkTodo(this)"
value="1"
data-list="<?=$todo->id?>"
class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"
/>
</td>
<td class="px-6 py-4">
<a href="./delete.php?todo_id=<?=$todo->id?>" class="font-medium text-blue-600">Hapus</a>
</td>
</tr>
<?php endforeach;?>
</tbody>
</table>
</div>
</div>

<script src="script.js"></script>
</body>
</html>

Buat file baru bernama list_todos.php didalam folder views . File ini yang akan menampilkan list todo kita nantinya. Karena file ini akan menampilkan list todo maka file ini membutuhkan todo yang ada di database, lalu bagaimana caranya kita mengirimkan todo ke file tersebut?. Kita akan mengirimkan todo ke file tersebut melalui controller

Membuat controller

<?php

namespace AMCC\MVC\Controller;

use AMCC\MVC\Model\Todo;
use AMCC\MVC\View\Page;

class TodoController
{
public function index()
{
$data = Todo::getAllTodos();
Page::render('list_todos', [
'todos' => $data,
]);
}
}

Buat controller baru dengan cara membuat file dengan nama TodoController.php didalam folder src/controller lalu copy paste kode diatas ke dalam file yang barusan dibuat. Controller tersebut memiliki satu method yaitu index , method inilah yang nantinya akan menampilkan list todo kita. Pertama tama kita mengambil semua todo dari database menggunakan static method getAllTodos milik model Todo lalu hasilnya disimpan di variabel $data . Lalu kita panggil juga tampilan list_todo yang sebelumnya kita buat menggunakan static method render , tak lupa kita juga mengirimkan todo yang sebelumnya sudah kita query dari database.

Menambahkan route

Walaupun kita sudah membuat model, view dan controller tetapi kita tidak mendaftarkannya dengan router maka semua itu tidak akan pernah bisa diakses atau tidak bisa tampil di browser. Maka dari itu kita harus mendaftarkannya dengan router di entrypoint yaitu index.php

Router::add('GET', '/todos', TodoController::class, 'index');

Dengan menggunakan static method add kita dapat dengan mudah menambahkan rute baru, seperti pada contoh diatas kita menambahkan rute baru dengan url /todos . Jadi begitu kalian mengakses /todos pada browser kalian maka method index milik TodoController lah yang akan memproses permintaan kalian. Sekarang coba buka localhost/<nama-folder-kalian>/public/index.php/todos lihat apa yang ditampilkan

Referensi

--

--