Anda di halaman 1dari 14

Membuat MVC Framework PHP Sederhana Sendiri

Sudah tahu Framework PHP?.


Sudah tahu konsep MVC?.
Jika belum tahu sebaiknya kamu cari tahu dulu sebelum
lanjut ke solusi midhigh kali ini.
Sekarang banyak MVC Framework PHP yang bisa dipakai
secara gratis salah satunya CodeIgniter dll. Namun kali kita tidak akan membahas
framework tersebut tatapi, bagai mana membuat framework sederhana sendiri berdasarkan
konsep MVC. Sebelum kita mulai sebaiknya kita ulang sekilas tentang MVC itu sendiri, MVC
adalah suatu konsep Model View Controller. Pada dasarnya dalam konsep MVC ini, Model
merupakan pengolah data dan berkomunikasi dengan database, View adalah tampilan yang
ditampilkan ke user, sedangkan Controller merupakan pengolah request user dan
mengembalikan request user dalam bentuk View. Bagaimana sekarang sudah siap untuk
memulai membuat framework kamu sendiri, Jika sudah Lets go to TKP.
1.

Buatlah struktur folder seperti berikut pada directory root web kamu.

2.
Sedah tahu tujuan dari masing-masing folder. Kita bahas sekilas ya. untuk
folder controllers, models, views tujuanya sama seperti konsep mvc diatas. folder
config untuk menampung file configurasi yang nantinya bisa kita rubah untuk
penyesuaian, sedangkan core untuk menampung semua file dari init framework ini.
3.
Buat file index.php pada directory utama seperti gambar diatas dan isi script
berikut:
<?php
/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
error_reporting(E_ALL);

/* Nama folder aplikasi */


$application_folder = 'apps';
/* Ganti pemisah direktori pada unix untuk konsistensi */
define('ROOT', str_replace("\\", "/", realpath(dirname(__FILE__))) . '/');
/* Menentukan BASEPATH sebagai root aplikasi */
define('BASEPATH', ROOT . $application_folder . '/');
/* Awal output buffering */
ob_start();
session_start();
/* Menjalankan program melalui router */
require BASEPATH . 'core/router.php';
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
$router = new Router();
$router->do_request();
/* Akhir output buffering */
@ob_end_flush();
/* Tampilan Error */
function show_error($message = '') {
ob_end_clean();
$error = '<html><head><title>Error</title>';
$error .= '<style type="text/css">';
$error .= 'body {margin:0; padding:0; font-family: sans-serif; color:#222;}';
$error .= '#error {margin: 30px auto; width: 600px; '.
' border: 2px crimson solid; padding: 10px; '.
' background: pink; text-align: center;}';
$error .= '</style>';
$error .= '</head><body><div id="error">';
if($message == '') {
$message = '<b>404 - Page not found!</b>';
}
$error .= $message;
$error .= '</div></body></html>';
exit ($error);
}
/* Akhir file index.php */
/* Lokasi: ./index.php */

4.
Pada folder config buat dua file berikut:
config.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*

* SCRIPT INI DITULIS OLEH IBNU IMAM.


* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
$config['site_open'] = TRUE;
$config['use_database'] = TRUE;
/* Dinamik Base Url */
if(isset($_SERVER['HTTP_HOST'])) {
$config['base_url'] = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) ==
'on' ? 'https' : 'http';
$config['base_url'] .= '://'. $_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']), '',
$_SERVER['SCRIPT_NAME']);
} else {
$config['base_url'] = '';
}
/* default controller */
$config['default_controller'] = '';
/* Akhir file config.php */
/* Lokasi: ./config.php */

database.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
/* aktif pengaturan dalam group */
$active_group = 'default';
$db['default']['hostname']
$db['default']['username']
$db['default']['password']
$db['default']['database']

=
=
=
=

"localhost";
"root";
"";
"dbname";

/* Akhir database.php */
/* Lokasi: ./database.php */

5.
Berikutnya pada folder core buat file berikut:
config.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Config {
private $items = array();
public function __construct() {
require BASEPATH.'config/config.php';
$this->items = $config;
}
public function item($item) {
if(isset ($this->items[$item])) {
return $this->items[$item];
} else {
return false;
}
}
public function set_item($item, $value = '') {
$this->items[$item] = $value;
}
public function unset_item($item) {
unset ($this->items[$item]);
}
}
/* Akhir config.php */
/* Lokasi: ./config.php */

controller.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Controller {
protected $load;
private static $instance;
public $config;

public function __construct() {


self::$instance = $this;
require_once BASEPATH . 'core/loader.php';
require_once BASEPATH . 'core/config.php';
$this->load = new Loader();
$this->config = new Config();
if(!$this->config->item('site_open')) {
show_error('Maaf, web ini sedang dalam perbaikan.');
}
if($this->config->item('use_database')) {
spl_autoload_register('load_db');
}
//Bisa menambahkan library lain disini;
}
public static function &get_instance() {
return self::$instance;
}
}
function &get_instance() {
return Controller::get_instance();
}
function base_url($clear = false) {
$CI =& Controller::get_instance();
if($clear) {
return $CI->config->item('base_url');
}
return $CI->config->item('base_url') . 'index.php/';
}
function load_db() {
include BASEPATH.'core/database.php';
}
function redirect($uri = '', $method = 'location', $http_response_code = 302) {
if ( ! preg_match('#^https?://#i', $uri)) {
$uri = site_url($uri);
}
switch($method) {
case 'refresh'
break;
default
break;
}
exit;

: header("Refresh:0;url=".$uri);
: header("Location: ".$uri, TRUE, $http_response_code);

}
/* Akhir file controller.php */
/* Lokasi: ./controller.php */

database.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Database {
private static $db_config;
private static $db_handler;
public function __construct() {}
public function __clone() {
trigger_error('Clone is not allowed', E_USER_ERROR);
}
public static function &handler($config_name = 'default') {
if(!isset (self::$db_handler)) {
self::connect($config_name);
}
return self::$db_handler;
}
private static function connect($config_name = 'default') {
/* Mengambil pengaturan dari file config database */
require BASEPATH.'config/database.php';
self::$db_config = $db[$config_name];
self::$db_handler = @mysql_connect(self::$db_config['hostname'],
self::$db_config['username'], self::$db_config['password']);
if(self::$db_handler != 0) {
if(mysql_select_db(self::$db_config['database'], self::$db_handler)) {
return TRUE;
}
}
return FALSE;
}
private static function disconnect() {
if(@mysql_close(self::$db_handler) != 0) {
return TRUE;
} else {
return FALSE;
}
}
}
/* Akhir file database.php */

/* Lokasi: ./database.php */

loader.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Loader {
public function __construct() {
}
public function view($view, $var = '') {
@ob_start();
if(is_array($var)) {
$the_vars = extract($var);
}
include BASEPATH.'views/'.$view.'.php';
@ob_end_flush();
}
public function model($model, $name = '') {
/* Mengambil instance */
$CI =& get_instance();
/* Cek apakah name kosong, menggunakan name model */
if($name == '') {
$name = strtolower($model);
}
/* Jika name ada, tampilkan pesan error */
if(isset ($CI->$name)) {
show_error('Error - model name "'. $name .'" is already defined');
} else {
$filename = BASEPATH.'models/'.strtolower($model).'.php';
if(file_exists($filename)) {
require_once BASEPATH.'core/model.php';
require_once $filename;
$model = ucfirst(strtolower($model));
$CI->$name = new $model();
} else {
show_error('Error - Model file "'. $name .'" could not be found');
}
}
}
public function library($lib, $name = '') {
/* Mengambil instance */
$CI =& get_instance();

/* Cek apakah name kosong, menggunakan name model */


if($name == '') {
$name = strtolower($lib);
}
/* Jika name ada, tampilkan pesan error */
if(isset ($CI->$name)) {
show_error('Error - library name "'. $name .'" is already defined');
} else {
$lib = ucfirst(strtolower($lib));
$filename = BASEPATH.'libraries/'.$lib.'.php';
if(file_exists($filename)) {
require_once $filename;
$CI->$name = new $lib();
} else {
show_error('Error - Model file "'. $name .'" could not be found');
}
}
}
}
/* Akhir file loader.php */
/* Lokasi: ./loader.php */

model.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Model
protected
protected
protected

{
$db;
$_result;
$_table;

function __construct($table = '') {


$this->db =& Database::handler();
if($table == '') {
$table = strtolower(get_class($this));
}
$this->_table = $table;
}
function __toString() {
return get_class($this) . ' model';
}
function selectAll() {
$query = 'select * from `'.$this->_table.'`';

return $this->query($query);
}
function select($id) {
$query = 'select * from `'.$this->_table.'` where
`id`=\''.mysql_real_escape_string($id).'\'';
return $this->query($query, TRUE);
}
/* Custom SQL Query */
function query($query, $singleResult = FALSE) {
$this->_result = mysql_query($query, $this->db);
if (preg_match("/select/i", $query)) {
$result = array();
$table = array();
$field = array();
$tempResults = array();
$numOfFields = mysql_num_fields($this->_result);
for ($i = 0; $i < $numOfFields; ++$i) {
array_push($table, mysql_field_table($this->_result, $i));
array_push($field, mysql_field_name($this->_result, $i));
}
while ($row = mysql_fetch_row($this->_result)) {
for ($i = 0; $i < $numOfFields; ++$i) {
$table[$i] = trim(ucfirst($table[$i]), "s");
$tempResults[$table[$i]][$field[$i]] = $row[$i];
}
if ($singleResult === TRUE) {
mysql_free_result($this->_result);
return $tempResults;
}
array_push($result, $tempResults);
}
mysql_free_result($this->_result);
return($result);
}
}
/** Get number of rows **/
function getNumRows() {
return mysql_num_rows($this->_result);
}
/** Free resources allocated by a query **/
function freeResult() {
mysql_free_result($this->_result);
}
}
/* Akhir file model.php */

/* Lokasi: ./model.php */

router.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


/*
* SCRIPT INI DITULIS OLEH IBNU IMAM.
* =====================================
* Email
: email@ibnuimam.com
* Blog
: http://blog.ibnuimam.com
* Company : http://midhighsolution.com
*/
class Router{
private
private
private
private

$_segment = array();
$_controller;
$_method;
$_var = array();

public function __construct() {


$this->_set_uri();
$this->_set_controller();
$this->_set_method();
$this->_set_vars();
}
/* Mencari dan menetapkan segment dari requested uri */
private function _set_uri() {
/* Mengambil semua segment pada string setelah script name */
$uri_string = str_replace( $_SERVER['REQUEST_URI'],
'', $_SERVER['SCRIPT_NAME']);
/* Jika file index tidak dideklarasi */
if($uri_string == 'index.php') {
$uri_string = '';
} else {
$uri_string = str_replace( $_SERVER['SCRIPT_NAME'],
'', $_SERVER['REQUEST_URI']);
$uri_string = preg_replace("|/*(.+?)/*$|", "\\1",
str_replace("\\", "/", $uri_string));
$uri_string = trim($uri_string, '/');
}
$this->_segment = preg_split('[\\/]', $uri_string, 0, PREG_SPLIT_NO_EMPTY);
}
/* Mencari class controller */
private function _set_controller() {
if(!isset ($this->_segment[0])) {
require BASEPATH.'config/config.php';
$this->_segment[0] = $config['default_controller'];
}

$controller_path = BASEPATH.'controllers/'.$this->_segment[0].'.php';
if(file_exists($controller_path)) {
require BASEPATH.'core/controller.php';
require $controller_path;
$class = ucfirst($this->_segment[0]).'Controller';
if(!class_exists($class)) {
show_error();
}
$this->_controller = new $class();
} else {
show_error();
}
}
/* Mencari class method */
private function _set_method() {
/* Jika tidak ada method yang dideklarasi, maka tetapkan ke index */
if(!isset ($this->_segment[1])) {
$this->_segment[1] = 'index';
}
/* Memeriksa apakah ada method */
if(method_exists($this->_controller, $this->_segment[1])) {
$this->_method = $this->_segment[1];
/* Jika private method, kirim ke 404 not found */
if(substr($this->_method, 0, 1) == '_') {
show_error();
}
} else {
show_error();
}
}
/* Tetapkan variabel dari uri segment */
private function _set_vars() {
if(isset ($this->_segment[2])) {
$this->_var = array_slice($this->_segment, 2);
}
}
public function do_request() {
call_user_func_array(array(&$this->_controller, $this->_method), $this->_var);
}
public function get_segment() {
return $this->_segment;
}
}
/* Akhir router.php */
/* Lokasi: ./router.php */

6.
Sekarang pondasi MVC sudah selesai. Mari kita coba untuk membuat Hello
World ya. Buka file config pada folder config dan isi base_url sesuai url yang kamu

pake. Contoh kita gunakan http://localhost/ms-mvc itu sesuai nama folder utama dari
framework ini kita buat. kemudian pada default_controller kita isi sesuai nama
controller pertama yang akan di load ketika web ini dibuka. contoh kita buat isi
dengan welcome.
7.
Buat file controller pada folder controllers dengan nama sesuai dari
default_controller yang kita isi sebelumnya. dalam contoh ini adalah welcome.php

<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');

class WelcomeController extends Controller {


public function __construct() {
parent::__construct();
}
function index() {
$this->load->view('welcome');
}
}

8.
Kemudian kita buat tampilannya di folder view. dan pastikan nama file
viewnya sama dengan nama yang kita load di dalam controller. $this->load>view('welcome'); berdasarkan controller kita maka kita buat file welcome.php pada
folder view.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');?>


<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to MS-MVC</title>
<style type="text/css">
::selection{ background-color: #E13300; color: white; }
::moz-selection{ background-color: #E13300; color: white; }
::webkit-selection{ background-color: #E13300; color: white; }
body {
background-color: #F63;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #fff;
}
a {

color: #003399;
background-color: transparent;
font-weight: normal;
}
h1 {
color: #fff;
background-color: transparent;
border-bottom: 1px solid #fff;
font-size: 19px;
font-weight: normal;
margin: 0 0 14px 0;
padding: 14px 15px 10px 15px;
}
code {
font-family: Consolas, Monaco, Courier New, Courier, monospace;
font-size: 12px;
background-color: #333;
border: 1px solid #fff;
color: #fff;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}
#body{
margin: 0 15px 0 15px;
}
p.footer{
text-align: right;
font-size: 11px;
border-top: 1px solid #D0D0D0;
line-height: 32px;
padding: 0 10px 0 10px;
margin: 20px 0 0 0;
}
#container{
margin: 10px;
border: 1px solid #fff;
}
</style>
</head>
<body>
<div id="container">
<h1>Welcome to MS-MVC</h1>
<div id="body">
<p>Halaman ini hanya contoh.</p>
<p>Jika kamu ingin mengedit halaman ini kamu dapat menemukannya di:</p>

<code>apps/views/welcome.php</code>
<p>Controller yang sesuai untuk halaman ini ditemukan di:</p>
<code>apps/controllers/welcome.php</code>
</div>
</div>
</body>
</html>

9.
Oke sekarang semuanya selesai. mari kita coba dengan membuka
dibrowser http://localhost/ms-mvc

Anda mungkin juga menyukai