Tahap Pembuatan Framework PHP WMC Sendiri Dengan Mudah

PropellerAds
Meskipun bukan hal baru, MVC masih menjadi salah satu pendekatan desain software yang cukup banyak digunakan. MVC adalah singkatan dari Model-View-Controller, termasuk dalam pola arsitektural yang digunakan dalam rekayasa perangkat lunak. Seperti namanya, komponen utama dalam MVC ini adalah Model, View, dan Controller.

Tujuan utama dari penggunaan pattern MVC adalah memisahkan komponen business logic dari tampilan atau user interface, sehingga diharapkan dapat memudahkan proses modifi kasi suatu bagian tanpa mempengaruhi bagian yang lainnya. Dalam MVC, model akan menjadi representasi data atau informasi dari sebuah aplikasi; view akan menjadi komponen yang berkaitan dengan tampilan; dan controller akan menjadi pengatur komunikasi yang terjadi dan juga aturan-aturan proses untuk memanipulasi data dari dan menuju model, yang kemudian ditampilkan dalam view.

Saat ini, PHP juga telah mendukung pola desain MVC dengan memanfaatkan fitur OOP (Object Oriented Programming) yang ada di dalamnya. Jika MVC dijelaskan secara sederhana dalam PHP, maka model adalah bagian yang meng-handle keseluruhan proses database. Model akan menghubungkan aplikasi ke database, dan juga berfungsi sebagai lapisan abstraksi data. View akan mendeskripsikan bentuk tampilan html, css, dan juga javascript di dalamnya. Controller akan menjadi jantung dan otak dari aplikasi MVC, yang tugasnya menghubungkan antara user dengan model dan view.

Dalam dunia web, MVC kali pertama diimpementasikan oleh David Heinemeier Hansson dalam sebuah framework bahasa Ruby, yaitu Ruby on Rails. Karena desainnya yang sangat baik, pola tersebut diimplementasikan pula pada bahasa pemrograman web lainnya, salah satunya adalah PHP.

Sebenarnya, framework MVC untuk PHP telah banyak beredar. Hampir semua framework populer saat ini menerapkan pola desain MVC ini. Beberapa contoh framework MVC untuk PHP yang cukup populer adalah CodeIgniter, CakePHP, Kohana, dan Symfony Framework. Meskipun Anda bisa saja menggunakan framework yang sudah jadi tersebut, tidak ada salahnya jika Anda mencoba membuat sendiri framework MVC sendiri sesuai keingin an Anda. Dengan demikian, bisa mengatur sendiri bagaimana jalannya aplikasi PHP Anda.

Kali ini, saya coba menjelaskan gambaran singkat bagaimana membuat sebuah framework MVC sederhana untuk pemrograman web dengan PHP. Bagian yang cukup penting dalam pembuatan framework MVC untuk web adalah mengerti bagaimana jalannya request.
  1. User mengetikkan URL http://site. com/blog.
  2. Framework mengarahkan request tersebut ke Controller dalam fi le blog. php.
  3. Controller akan melakukan request data-data yang diperlukan dari database dengan menggunakan Model.
  4. Model mengembalikan data-data tersebut untuk selanjutnya diproses kembali dalam Controller.
  5. Controller menerima data, lalu melanjutkan proses program yang diperlukan, lalu mengatur format informasi data untuk kemudian diarahkan ke dalam View.
  6. Terakhir, Controller menampilkan hasil View tersebut ke browser milik User.

Tidak semua framework MVC bekerja seperti ini. Tapi, cara kerja seperti ini sudah cukup untuk menjadi dasar pembuatan framework MVC.

Untuk mencoba tutorial ini, beberapa requirement yang harus Anda penuhi adalah:

Apache server dengan PHP 5.0 ke atas.
MySQL Server 5.0 ke atas.
Browser modern (Firefox, Chrome, dll).

Struktur Folder Aplikasi

Sebelum memulai untuk membuat framework ini, yang dilakukan kali pertama adalah membuat struktur folder dari aplikasi MVC Anda. Gambar 4 menunjukkan struktur sederhana dari framework yang akan dibuat dalam artikel ini. Namun, setelah mengerti bagaimana cara kerja framework ini, Anda bisa mengubah-ubahnya sesuai kebutuhan dan keinginan Anda.

Pada struktur folder yang ada di gambar, seluruh komponen aplikasi terletak dalam folder application. Hal ini untuk memudahkan pembuatan berbagai aplikasi lain dalam sebuah root yang sama. Selain itu, untuk konsistensi penulisan kode program, aturan yang dipakai dalam artikel ini adalah sebagai berikut.
  • Nama fi le selalu menggunakan huruf kecil.
  • Nama folder selalu menggunakan huruf kecil.
  • Nama fungsi atau method menggunakan huruf kecil, dengan pemisah antarkata berupa karakter underscore.
  • Huruf pertama setiap kata pada nama class menggunakan huruf kapital. Tidak ada karakter pemisah antarkata dalam nama class.
  • Method yang memiliki akses private, diawali dengan karakter underscore.
  • Nama class untuk Model harus sama dengan nama fi le-nya. Bedanya, nama class tetap dengan huruf pertama kapital, sedangkan nama fi le tetap menggunakan huruf kecil.
  • Untuk menghindari kesamaan nama class antara Controller dan Model, maka untuk nama class Controller harus disertai suffi x “Controller”. Contoh: BlogController. Sedangkan nama fi le untuk controller tetap tanpa suffi x tersebut.
  • Setiap fi le php diawali dengan tag php “<?php”, namun tidak ditutup dengan “?>”. Hal ini untuk menghindari adanya whitespace pada saat menampilkan output.

Config.php

Salah satu bagian yang harus diatur kali pertama dalam program adalah fi le confi g.php. File ini berisi konfi gurasikonfi gurasi umum dari program MVC yang akan dibuat. Beberapa konfi gurasi tersebut adalah:

site_open: menentukan apakah site dalam keadaan dibuka atau tidak.
use_database: menentukan apakah aplikasi menggunakan database atau tidak. Jika ya, maka program akan membuat koneksi dengan database sesuai konfigurasi database yang digunakan.
base_url: merupakan URL utama dari site. Sangat berguna dalam membuat link.
default_controller: menentukan controller mana yang akan diakses, jika dalam URL tidak mencantumkan nama controller.

Konfi gurasi di atas diletakkan dalam variable array, dan dimasukkan dalam file config/config.php. Perlu diingat bahwa file ini hanya “menyimpan” variable konfi gurasi. Berikut ini kode fi le confi g/confi g.php:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
// apakah site dibuka
$confi g[‘site_open’] = TRUE;
// menggunakan database $confi g[‘use_database’] = TRUE;
// base_url secara dinamis
if(isset($_SERVER[‘HTTP_HOST’])) {
$confi g[‘base_url’] = isset($_ SERVER[‘HTTPS’])
&amp;&amp; strtolower($_SERVER[‘HTTPS’]) == ‘on’ ? ‘https’ : ‘http’;
$confi g[‘base_url’] .= ‘://’. $_SERVER[‘HTTP_HOST’];
$confi g[‘base_url’] .= str_ replace(basename($_SERVER[‘SCRIPT_ NAME’]),
‘’, $_SERVER[‘SCRIPT_NAME’]);
} else {
$confi g[‘base_url’] = ‘http:// localhost/mvc’;
}
// default controller
$confi g[‘default_controller’] = ‘homepage’;

Karena file selain index.php tidak boleh diakses secara langsung melalui URL, maka pada baris pertama dituliskan bahwa jika BASEPATH belum dideklarasikan (yang sebenarnya ada pada index.php), maka akan muncul pesan error.

Berikutnya, untuk lebih mudah mengakses variabel-variabel confi g tersebut, salah satu cara adalah dengan membuat class Confi g yang dapat mengakses, dan mengubah konfi gurasi pada saat program berjalan. Class tersebut diletakkan dalam fi le core/confi g.php:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Confi g {
private $items = array();
public function __construct() {
require BASEPATH.’confi g/confi g. php’;
$this-&gt;items = $confi g;
}
public function item($item) {
if(isset ($this-&gt;items[$item])) {
return $this-&gt;items[$item];
} else {
return false;
}
}
public function set_item($item, $value = ‘’) { $this-&gt;items[$item] = $value; }
public function unset_item($item) {
unset ($this-&gt;items[$item]);
}
}

Class sederhana ini memungkinkan program untuk mengubah ataupun mendeklarasikan konfi gurasi baru pada saat program berjalan. Penggunaannya akan cukup terlihat pada controller nantinya.

Index.php

Pemrograman PHP MVC menggunakan satu gateway dalam menerima request dari client, yaitu pada fi le index.php. Artinya, seluruh request dari client, selain gambar dan fi le lain, harus melalui file index.php tersebut. File tersebut akan melakukan routing untuk mengakses fi le php lainnya, sesuai dengan konsep MVC. Untuk langkah awal, buatlah sebuah fi le php dengan nama index pada root directory:

&lt;?php /**
* Nama folder aplikasi
*/
$application_folder = ‘application’;
/**
* Mengganti separator untuk konsistensi
*/
defi ne(‘ROOT’, str_replace(“\\”, “/”, realpath(dirname(__FILE__))) . ‘/’);
/**
* Deklarasi basepath
*/
defi ne(‘BASEPATH’, ROOT . $application_ folder . ‘/’);
// mulai output buffering
ob_start();
// mulai program melalui router
require BASEPATH . ‘core/router.php’;
$router = new Router();
$router-&gt;do_request();
// tutup buffer dan menampilkan output @ob_end_fl ush();
// fungsi untuk menampilkan message error
function show_error($message = ‘’) {
ob_end_clean(); $error = ‘&lt;html&gt;&lt;head&gt;&lt;title&gt;Error&lt;/ title&gt;’;
$error .= ‘&lt;style type=”text/css”&gt;’;
$error .= ‘body {margin:0; padding:0; font-family: sans-serif;}’;
$error .= ‘#error {margin: 30px auto; width: 600px; ‘.
‘ border: 2px crimson solid; padding: 10px; ‘.
‘ background: pink; text-align: center;}’;
$error .= ‘&lt;/style&gt;’;
$error .= ‘&lt;/head&gt;&lt;body&gt;&lt;div id=”error”&gt;’;
if($message == ‘’) {
$message = ‘404 - Page not found!’;
}
$error .= $message;
$error .= ‘&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;’;
exit ($error);
}

Dalam fi le ini, ada beberapa variabel global atau konstanta yang didefi nisikan, yaitu application_folder untuk memudahkan rename dari folder aplikasi, ROOT untuk definisi lokasi aplikasi dalam server, dan BASEPATH sebagai lokasi folder aplikasi yang relatif terhadap server.

Program akan memulai dengan meng aktifkan buffer untuk output. Keuntungan dari menggunakan buffer ini adalah mempercepat proses karena seluruh output disimpan terlebih dahulu sebelum ditampilkan. Setelah itu, program akan memanggil core/router.php yang merupakan salah satu komponen utama aplikasi. Isi dari router.php ini akan dijelaskan kemudian.

Program diakhiri dengan memanggil on_end_fl ush yang tujuannya adalah menutup buffer dan menampilkan keseluruhan output yang disimpan sebelumnya. Pada bagian bawah, fungsi show_error() hanyalah alat bantu untuk menampilkan error dengan mudah.

Router.php

File ini merupakan nyawa dari program MVC, karena file ini bertugas memisahkan logika Model, View, dan Controller, beserta parameter yang dimasukkan. Proses yang dilakukan adalah mendapatkan URI request dari user. Pada program MVC ini, struktur URI yang digunakan adalah: http://domain.com/index.php/controller/ method/par1/par2.

Kelebihan URI dengan struktur seperti ini adalah mudah dibaca dan cukup baik untuk SEO (Search Engine Optimization). Selain itu, hanya developer-lah yang benar-benar tahu apa maksud parameter- parameter yang dimasukkan.

Dari URI tersebut, router akan mengolahnya, lalu menjalankan program berdasarkan segmen-segmen dalam URI, sebagai berikut.

Segment 0 - Controller.
Segment 1- Method.
Segment 2-dst - Parameter.

Untuk lebih jelasnya, coba Anda perhatikan dengan seksama source code untuk Router.php di bawah ini:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Router{
private $_segment = array();
private $_controller;
private $_method;
private $_var = array();
public function __construct() {
$this-&gt;_set_uri();
$this-&gt;_set_controller();
$this-&gt;_set_method();
$this-&gt;_set_vars(); }
/**
* Mengambil URI request
*/
private function _set_uri() {
$uri_string = str_replace($_ SERVER[‘REQUEST_URI’],
‘’, $_SERVER[‘SCRIPT_NAME’]);
// jika fi le index tidak dituliskan
if($uri_string == ‘index.php’) {
$uri_string = ‘’;
} else {
$uri_string = str_replace($_ SERVER[‘SCRIPT_NAME’],
‘’, $_SERVER[‘REQUEST_&nbsp;URI’]);
// menghapus slash di awal dan akhir
$uri_string = preg_ replace(“|/*(.+?)/*$|”, “\\1”,
str_replace(“\\”, “/”, $uri_string));
// menghapus jika hanya slash saja
$uri_string = trim($uri_string, ‘/’);
}
// memecah uri tersebut ke dalam segmen-segmen
$this-&gt;_segment = preg_ split(‘[\\/]’, $uri_string, 0, PREG_ SPLIT_NO_EMPTY);
}
/**
* Mencari class controller
*/
private function _set_controller() {
if(!isset ($this-&gt;_segment[0])) {
require BASEPATH.’confi g/confi g. php’;
$this-&gt;_segment[0] = $confi g[‘default_controller’];
}
$controller_path = BASEPATH.’controllers/’.$this-&gt;_ segment[0].’.php’;
if(fi le_exists($controller_path)) {
require BASEPATH.’core/ controller.php’;
require $controller_path;
$class = ucfi rst($this-&gt;_segment[ 0]).’Controller’;
if(!class_exists($class)) {
show_error();
}
$this-&gt;_controller = new $class();
} else {
show_error();
}
}
/**
* Mencari method dari class
*/
private function _set_method() {
// jika method tidak didefi nisikan, panggil index
if(!isset ($this-&gt;_segment[1])) { $this-&gt;_segment[1] = ‘index’;
}
// cek apakah method tersedia
if(method_exists($this-&gt;_ controller, $this-&gt;_segment[1])) {
$this-&gt;_method = $this-&gt;_ segment[1];
// jika method adalah private
if(substr($this-&gt;_method, 0, 1) == ‘_’) {
show_error();
}
} else {
show_error();
}
}
/**
* Ambil variable untuk method
*/
private function _set_vars() {
if(isset ($this-&gt;_segment[2])) {
$this-&gt;_var = array_slice($this- &gt;_segment, 2);
}
}
/**
* Menjalankan request
*/
public function do_request() { $this-&gt;_controller-&gt;{$this-&gt;_ method}(implode(‘,’, $this-&gt;_var));
}
public function get_segment() {
return $this-&gt;_segment;
}
}

Router adalah class yang berfungsi mengatur jalannya request. Cara kerja router ini dapat dilihat pada conctrustor- nya. Pertama-tama, object router akan memanggil method _set_uri() yang akan mengambil URI dari request user. Tugas lain dari method tersebut adalah memecah URI menjadi segmen-segmen dalam sebuah array.

Setelah array segmen didapatkan, maka otomatis router akan membaca bahwa segmen index nol adalah controller, index ke-1 adalah method, dan index berikutnya adalah parameter-parameter yang digunakan. Konfi gurasi default_controller akan digunakan jika index nol kosong. Method index akan dipanggil jika index ke-1 kosong.

Coba Anda lihat kembali pada source code index.php. Setelah object dari class Router dibuat, maka program akan memanggil method do_request() untuk menjalankan routing dari request tersebut sehingga program bisa berjalan.

Loader.php

Sebelum masuk ke dalam Controller, satu lagi komponen penting yang akan sering digunakan dalam program adalah class Loader. Class ini bertugas untuk me-load resource dari dalam controller. Resource dapat berupa library, model, view, plugin, dan sebagainya. Namun pada tutorial kali ini, loader cukup mempunyai fungsi untuk me-load view dan model saja:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Loader {
// load fi le untuk tampilan
public function view($view, $var = ‘’) {
@ob_start();
if(is_array($var)) {
$the_vars = extract($var);
}
include BASEPATH.’/views/ ’.$view.’.php’;
@ob_end_fl ush();
}
// load model untuk koneksi dengan database
public function model($model, $name = ‘’) {
// mendapatkan instance dari controller
$CI =&amp; get_instance();
// cek apakah nama tersebut kosong
if($name == ‘’) {
$name = strtolower($model);
}
// jika nama telah dipakai, maka error
if(isset ($CI-&gt;$name)) {
show_error(‘Error - model name “’. $name .’” is already defi ned’);
} else {
$fi lename = BASEPATH.’models/’. strtolower($model).’.php’;
if(fi le_exists($fi lename)) {
require_once BASEPATH.’core/ model.php’;
require_once $fi lename;
$CI-&gt;$name = new $model();
} else {
show_error(‘Error - Model fi le “’. $name .’” could not be found’);
}
}
}
}

Method view akan me-load fi le yang bertindak sebagai tampilan website dalam folder views. Sedangkan method model akan me-load model dalam folder models, yang kemudian object dari model tersebut dimasukkan sebagai property dari controller agar dapat diakses secara langsung.

Misalnya, nama class dari model adalah “Blog”. Maka setelah pemanggilan $this->load->model(‘blog’); model tersebut dapat diakses secara langsung dengan cara $this->blog;

Controller.php

Otak dari program MVC terletak pada controller-nya. Seluruh controller terletak dalam folder controllers, dengan nama fi le dan class sesuai aturan di bagian awal artikel ini. Agar dapat bekerja, setiap controller harus menjadi child dari class utama Controller yang terletak dalam fi le core/controller.php.

Class Controller menggunakan desain pattern singleton, yang artinya dalam aplikasi hanya boleh ada 1 instance dari class tersebut. Controller ini akan me-load konfi gurasi dalam fi le confi g/ confi g.php menggunakan class Confi g yang telah dibuat sebelumnya. Setelah itu, dari konfi gurasi tersebut akan dicek apakah site dalam keadaan dibuka atau tidak. Jika tidak, maka akan muncul pesan error. Langkah berikutnya, akan mengecek apakah site menggunakan database atau tidak. Jika ya, maka akan dilakukan proses load class Database (akan dijelaskan kemudian):

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Controller {
protected $load;
private static $instance;
protected $confi g;
public function __construct() {
self::$instance = $this;
require_once BASEPATH . ‘core/ loader.php’;
require_once BASEPATH . ‘core/ confi g.php’;
$this-&gt;load = new Loader();
$this-&gt;confi g = new Confi g();
if(!$this-&gt;confi g-&gt;item(‘site_ open’)) {
show_error(‘Sorry, this site is under maintenance’);
}
if($this-&gt;confi g-&gt;item(‘use_ database’)) {
spl_autoload_register(‘load_ db’);
}
}
public static function &amp;get_ instance() {
return self::$instance;
}
}
function &amp;get_instance() {
return Controller::get_instance();
}
function base_url() {
$CI =&amp; Controller::get_instance();
return $CI-&gt;confi g-&gt;item(‘base_url’) . ‘index.php/’;
}
function load_db() {
include BASEPATH.’core/database. php’;
}

Fungsi get_instance() dibuat untuk memudahkan pengambilan instance dari controller yang sedang aktif tersebut dari bagian manapun dalam program. Fungsi load_db akan di-load secara otomatis menggunakan fungsi spl_autoload_ register() yang memungkinkan class tersebut tidak harus di-load di setiap fi le yang membutuhkannya.

Database.php

Berikutnya adalah membuat komponen yang bertugas mengatur hubungan atau koneksi dengan database. Sebelum membuat class yang mengaturnya, pertamatama harus mengatur konfi gurasinya terlebih dahulu. Agar lebih memudahkan, konfi gurasi database diletakkan di fi le terpisah dalam confi g/database.php:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
// active group setting $active_group = ‘default’;
$db[‘default’][‘hostname’] = “localhost”;
$db[‘default’][‘username’] = “username”;
$db[‘default’][‘password’] = “password”;
$db[‘default’][‘database’] = “database”;

Tujuan dari dimasukkannya konfi - gurasi dalam array multidimensi adalah agar dapat membuat beberapa konfi gurasi sekaligus. Group yang aktif didefi nisikan dalam variable $active_group.

Setelah membuat konfi gurasi tersebut, berikutnya adalah membuat class yang bertugas membuat koneksi, atau memutuskannya. Class tersebut diletakkan dalam fi le core/database.php:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Database {
private static $db_confi g;
private static $db_handler;
public function __construct() {}
public function __clone() {
trigger_error(‘Clone is not allowed’, E_USER_ERROR);
}
public static function &amp;handler($confi g_name = ‘default’) {
if(!isset (self::$db_handler)) {
self::connect($confi g_name);
}
return self::$db_handler;
}
private static function connect($confi g_name = ‘default’) {
// get database config
require BASEPATH.’confi g/database. php’;
self::$db_confi g = $db[$confi g_ name];
self::$db_handler = @mysql_ connect(self::$db_confi g[‘hostname’],
self::$db_confi g[‘username’], self::$db_confi g[‘password’]);
$GLOBALS[‘fi re’]-&gt;log(self::$db_ handler);
if(self::$db_handler != 0) {
if(mysql_select_db(self::$db_ confi g[‘database’], self::$db_handler)) {
return TRUE;
}
}
return FALSE;
}
private static function disconnect(){
if(@mysql_close(self::$db_handler)&nbsp;!= 0) {
return TRUE;
} else {
return FALSE;
}
}
}

Class ini juga menggunakan desain pattern singleton. Sebab dalam satu aplikasi, hanya diperlukan sebuah handler untuk database tersebut. Class Database akan digunakan dalam class Model yang akan menjadi representasi table ataupun sekedar interface antara program dengan database.

Model.php

Membuat query adalah salah satu hal penting dalam pembuatan aplikasi web yang menggunakan database. Sangat merepotkan bila setiap akan membuat query, Anda harus mendefi nisikan table mana yang akan dicari. Lebih merepotkan lagi untuk mengatur letak fungsifungsi yang berkaitan dengan CRUD (Create, Read, Update, Delete) agar mudah dibaca dan diedit. Sebab dalam sebuah request, terkadang tidak perlu untuk meload seluruh fungsi.

Model dirancang sedemikian rupa untuk meng-handle masalah tersebut. Agar model yang Anda buat dapat digunakan, model tersebut harus menjadi child dari class Model yang akan mengatur urusan koneksi database:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Model {
protected $db;
protected $_result;
protected $_table;
function __construct($table = ‘’) {
$this-&gt;db =&amp; Database::handler();
if($table == ‘’) {
$table = strtolower(get_ class($this));
}
$this-&gt;_table = $table;
}
function __toString(){
return get_class($this) . ‘ model’;
}
function selectAll() {
$query = ‘select * from `’.$this- &gt;_table.’`’;
return $this-&gt;query($query);
}
function select($id) {
$query = ‘select * from `’.$this- &gt;_table.’` where `id` = \’’.mysql_ real_escape_string($id).’\’’;
return $this-&gt;query($query, TRUE);
}
/** Custom SQL Query **/
function query($query, $singleResult = FALSE) {
$this-&gt;_result = mysql_ query($query, $this-&gt;db);
if (preg_match(“/select/i”, $query)) {
$result = array();
$table = array();
$fi eld = array();
$tempResults = array();
$numOfFields = mysql_num_ fi elds($this-&gt;_result);
for ($i = 0; $i &lt; $numOfFields; ++$i) {
array_push($table, mysql_fi eld_ table($this-&gt;_result, $i));
array_push($fi eld, mysql_fi eld_ name($this-&gt;_result, $i)); }
while ($row = mysql_fetch_ row($this-&gt;_result)) {
for ($i = 0; $i &lt; $numOfFields; ++$i) {
$table[$i] = trim(ucfi rst($ta ble[$i]), “s”);
$tempResults[$table[$i]][$fi e ld[$i]] = $row[$i];
}
if ($singleResult === TRUE) {
mysql_free_result($this- &gt;_result);
return $tempResults;
}
array_push($result, $tempResults);
}
mysql_free_result($this-&gt;_ result);
return($result);
}
}
/** Get number of rows **/
function getNumRows() {
return mysql_num_rows($this- &gt;_result);
}
/** Free resources allocated by a query **/
function freeResult() {
mysql_free_result($this-&gt;_result);
}
}

Pada saat object dari class model tersebut dibuat, maka akan dilakukan koneksi database dan setting table untuk object tersebut. Jika parameter table tidak diisi, maka secara otomatis program akan memasukkan nama class sebagai nama table. Perlu diingat kembali, sangat tidak disarankan untuk me-load model secara manual dengan membuat instance biasa. Selalu gunakan Loader untuk me-load model ini agar berjalan lancar.

Beberapa method yang penting dalam class model ini adalah selectAll(), select(), dan query(). Method tersebut mempermudah pembuatan program dalam hal query. Method query mejadi titik utama dalam pembuatan query serta format hasil dari query select agar mudah dibaca dan diakses.

Contoh Program Sederhana

Untuk membuat sebuah program dengan CRUD sederhana menggunakan framework MVC ini cukup mudah. Karena aplikasi ini menggunakan database, maka sebelum Anda memulai, buatlah sebuah database dalam server local Anda. Buat juga user yang punya all privilege untuk database tersebut.

Dalam contoh ini, nama database adalah “mvc”, dengan user dan password yang digunakan juga “mvc”. Atur konfi gurasi database Anda di fi le confi g/database.php menjadi seperti di bawah ini:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
// active group setting $active_group = ‘default’;
$db[‘default’][‘hostname’] = “localhost”;
$db[‘default’][‘username’] = “mvc”;
$db[‘default’][‘password’] = “mvc”;
$db[‘default’][‘database’] = “mvc”;

Untuk contoh data, jalankan query di bawah ini. Anda bisa menggunakan phpmyadmin ataupun console mysql:

CREATE TABLE `items` (
`id` int(11) NOT NULL auto_ increment,
`item_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `items` VALUES(1, ‘haqqi’);
INSERT INTO `items` VALUES(2, ‘fauzil’);

Berikutnya adalah membuat controller yang akan digunakan. Buatlah fi le controllers/homepage.php dengan isi fi le sebagai berikut:

&lt;?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class HomepageController extends Controller {
function index() {
$data = array();
if(isset ($_POST[‘submit’])) {
$this-&gt;load-&gt;model(‘item’);
$data[‘result’] = $this-&gt;item- &gt;get_item($_POST[‘id’]);
}
$this-&gt;load-&gt;view(‘homepage’, $data);
}
}

Perhatikan bahwa method index adalah method yang secara default dipanggil, jika dalam URL nama method tidak dideskripsikan. Program akan mengecek, jika terdapat variable $_ POST[‘submit’], maka program akan melakukan pencarian dalam database menggunakan model “item”. Setelah itu, hasilnya akan diarahkan sebagai parameter untuk me-load view.

Model item yang digunakan cukup sederhana, hanya memanfaatkan method dari parent class-nya, Model. Karena itu, buatlah sebuah fi le models/ item.php dengan isi sebagai berikut:
<?php if ( ! defi ned(‘BASEPATH’)) exit(‘No direct script access allowed’);
class Item extends Model {
public function __construct() {
parent::__construct(‘items’);
}
function get_item($id) {
return $this->select($id);
}
}

Method get_item() hanya memanfaatkan method parent class-nya, yaitu select(). Method tersebut dipanggil dalam HomepageController untuk mendapatkan data dari table items.

Untuk tampilan, buatlah fi le views/ homepage.php dengan isi sebagai berikut:


<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http:// www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/ xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8” />
<title>Demo Aplikasi MVC</title>
</head>
<body>
<h1>Pencarian Item</h1>
<form action=”<?php echo base_ url(); ?>homepage” method=”POST”>
<label for=”id”>ID : </label>
<input type=”text” name=”id” />
<input type=”submit” value=”Submit” name=”submit” />
</form>
<?php if(isset ($result)) {
echo ‘<br />Hasil Pencarian :<br />’;
echo ‘ID ‘. $result[‘Item’][‘id’] . ‘ adalah <b>’ . $result[‘Item’][‘name’] .’</b>’;
}
?>
</body>
</html>

File tersebut adalah file XHTML sederhana dengan sebuah form dan baris tambahan untuk menampilkan hasil pencarian, jika hasil tersebut dideklarasikan pada controller. Coba Anda perhatikan dengan seksama, variable $result pada fi le view ini sebenarnya merupakan variable $data[‘result’] yang terdapat pada HomepageController.

Setelah semua dibuat, coba Anda jalankan browser dan arahkan URL sesuai lokasi fi le Anda, misalnya http:// localhost/mvc. Maka tampilan yang akan Anda dapatkan adalah seperti pada gambar. Coba masukkan id yang akan Anda cari, lalu klik submit.

Dengan demikian, selesailah tutorial singkat bagaimana konsep pembuatan framework MVC untuk PHP. Sebagai referensi untuk mengembangkannya, Anda bisa membuka source code framework tersebut karena sebagian besar framework tersebut berlisensi open source.

Sekian pembahasan tentang Tahap Pembuatan Framework PHP WMC Sendiri Dengan Mudah, kurang lebihnya mohon maaf dan selalu saya sampaikan terima kasih.

Share this with short URL:

You Might Also Like:

Use parse tool to easy get the text style on disqus comments:
Show Parser Hide Parser