Pada pemrograman PHP tradisional, biasanya semua kode dijadikan satu, apakah layout, frontend, atau backend. Ini disebut juga spagetti code. Spagetti code menyebabkan sulitnya aplikasi dikembangkan karena setiap programmer memiliki gaya masing-masing sehingga untuk troubleshoot dan scalability sulit dilakukan.
Pemrograman PHP modern saat ini menggunakan konsep MVC (Model-View-Controller) untuk mengatasi hasil di atas. Model berhubungan dengan pengolahan data, View untuk menampilkan data, dan Controller untuk logika atau alur program.
Kita akan melihat proses MVC diawali dengan pembuatan spaghetti code untuk menampilkan anggota. Sebelumnya buatlah database db_oopmvc dan tabel anggota.
Spaghetti Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php // file: oopmvc/index.php $link = new PDO("mysql:host=localhost;dbname=db_oopmvc",'root','root'); $result = $link->query('SELECT id, nama FROM anggota'); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Daftar Anggota</title> </head> <body> <h1>Daftar Anggota</h1> <ul> <?php while($row = $result->fetch(PDO::FETCH_ASSOC)):?> <li><a href="detail.php?id=<?= $row['id'] ?>"> <?= $row['nama'];?></a></li> <?php endwhile;?> </ul> </body> </html> <?php $link = null;?> |
Meskipun bisa berfungsi, kode di atas sulit untuk di maintenance dan sulit di kembangkan. Karena itu kita akan memisahkan sesuai dengan fungsinya:
Memisahkan Presentation
Pisahkan kode untuk mendapatkan dan menampilkan data.
Ubah index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // file: oopmvc/index.php $link = new PDO("mysql:host=localhost;dbname=db_oopmvc",'root','root'); $result = $link->query('SELECT id, nama FROM anggota'); $anggota = []; while($row = $result->fetch(PDO::FETCH_ASSOC)){ $anggota[] = $row; } $link = null; //Memanggil list.php untuk menampilkan anggota require 'view/anggota/list.php'; |
Tambahkan file list.php di dalam folder view/anggota.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Daftar Anggota</title> </head> <body> <h1>Daftar Anggota</h1> <ul> <?php foreach($anggota as $row):?> <li><a href="detail.php?id=<?= $row['id'] ?>"> <?= $row['nama'];?></a></li> <?php endforeach;?> </ul> </body> </html> |
Hasilnya akan sama dengan kode sebelumnya.
Memisahkan Domain Logic
Selanjutnya kita perlu memisahkan kode untuk mendapatkan data (Model) dengan kode alur aplikasi (Controller).
Ubah index.php menjadi :
1 2 3 4 5 6 7 8 9 10 |
<?php // file: oopmvc/index.php //Memanggil Model require_once "model/anggota_model.php"; //Mendapatkan Data Anggota $anggota = getAllAnggota(); //Memanggil list.php untuk menampilkan anggota require 'view/anggota/list.php'; |
Tambahkan anggota_model.php di dalam folder model/anggota
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php //file: oopmvc/model/anggota_model.php function openDbConnection(){ $link = new PDO("mysql:host=localhost;dbname=db_oopmvc",'root','root'); return $link; } function closeDbConnection(){ $link = null; } function getAllAnggota(){ $link = openDbConnection(); $result = $link->query('SELECT id, nama FROM anggota'); $anggota = []; while($row = $result->fetch(PDO::FETCH_ASSOC)){ $anggota[] = $row; } closeDbConnection(); return $anggota; } |
Jika dijalankan sudah sama dan sudah dibagi menjadi Model, View, Controller. Namun ini adalah MVC yang paling mendasar.
Memisahkan Layout
Kita bisa memisahkan lagi view untuk menampilkan data dan file template yang akan digunakan sebagai pengatur layout utama. Di dalam file layout kita akan memanggil view untuk menampilkan data.
Buat file oopmvc/file/template.php sebagai file master template untuk mengatur layout utama.
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><?= $judul;?></title> </head> <body> <?= $isi;?> </body> </html> |
list.php diubah menjadi :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $judul = 'Daftar Anggota';?> <?php ob_start();?> <h1>Daftar Anggota</h1> <ul> <?php foreach($anggota as $row):?> <li> <a href="detail.php?id=<?= $row['id'] ?>"> <?= $row['nama'];?> </a> </li> <?php endforeach;?> </ul> <?php $isi = ob_get_clean();?> <?php include 'view/template.php';?> |
Jika dijalankan hasilnya tetap akan sama.
Menambahkan Detail Page
Kita akan membuat halaman detail ketika nama di klik.
Buat file oopmvc/detail.php sebagai controller halaman detail.
1 2 3 4 5 6 7 |
<?php require_once "model/anggota_model.php"; $anggota = getAnggotabyId($_GET['id']); require 'view/anggota/detail.php'; |
Tambahkan fungsi getAnggotaById() di anggota_model.php. Fungsi ini untuk mengambil data berdasarkan id anggota.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function getAnggotaById($id){ $link = openDbConnection(); $query = 'SELECT * FROM anggota WHERE id=:id'; $statement = $link->prepare($query); $statement->bindValue(':id',$id,PDO::PARAM_INT); $statement->execute(); $row = $statement->fetch(PDO::FETCH_ASSOC); closeDbConnection($link); return $row; } |
Buat file oopmvc/view/anggota/detail.php
1 2 3 4 5 6 7 8 9 10 |
<?php $judul = $anggota['nama'];?> <?php ob_start() ?> <h1><?= $anggota['nama'];?></h1> <p>Nama: <?= $anggota['nama'];?></p> <p>Tanggal Lahir: <?= $anggota['tanggal_lahir'];?></p> <p>Kota Lahir: <?= $anggota['kota_lahir'];?></p> <?php $isi = ob_get_clean() ?> <?php include 'view/template.php';?> |
Coba klik salah satu nama anggota.