217440308 membuat mvc framework php sederhana sendiri

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 Let’s 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 protected] * Blog : http://blog.ibnuimam.com

Upload: kumbangrawesenalangan

Post on 08-Dec-2015

223 views

Category:

Documents


7 download

DESCRIPTION

Membuat MVC Framework PHP Sederhana Sendiri

TRANSCRIPT

Page 1: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

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 Let’s 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 protected]

* Blog : http://blog.ibnuimam.com

* Company : http://midhighsolution.com

*/

 

error_reporting(E_ALL);

Page 2: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

 

/* 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');

/*

Page 3: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

* SCRIPT INI DITULIS OLEH IBNU IMAM.

* =====================================

* Email : [email protected]

* 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 protected]

* Blog : http://blog.ibnuimam.com

* Company : http://midhighsolution.com

*/

 

/* aktif pengaturan dalam group */

$active_group = 'default';

 

$db['default']['hostname'] = "localhost";

$db['default']['username'] = "root";

$db['default']['password'] = "";

$db['default']['database'] = "dbname";

 

/* Akhir database.php */

/* Lokasi: ./database.php */

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

Page 4: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

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

/*

* SCRIPT INI DITULIS OLEH IBNU IMAM.

* =====================================

* Email : [email protected]

* 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 protected]

* Blog : http://blog.ibnuimam.com

* Company : http://midhighsolution.com

*/

 

class Controller {

protected $load;

private static $instance;

public $config;

Page 5: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

 

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' : header("Refresh:0;url=".$uri);

break;

default : header("Location: ".$uri, TRUE, $http_response_code);

break;

}

exit;

}

 

/* Akhir file controller.php */

/* Lokasi: ./controller.php */

Page 6: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

database.php

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

/*

* SCRIPT INI DITULIS OLEH IBNU IMAM.

* =====================================

* Email : [email protected]

* 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 */

Page 7: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

/* Lokasi: ./database.php */

loader.php

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

/*

* SCRIPT INI DITULIS OLEH IBNU IMAM.

* =====================================

* Email : [email protected]

* 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();

Page 8: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

/* 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 protected]

* Blog : http://blog.ibnuimam.com

* Company : http://midhighsolution.com

*/

 

class Model {

protected $db;

protected $_result;

protected $_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.'`';

Page 9: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

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 */

Page 10: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

/* Lokasi: ./model.php */

router.php

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

/*

* SCRIPT INI DITULIS OLEH IBNU IMAM.

* =====================================

* Email : [email protected]

* Blog : http://blog.ibnuimam.com

* Company : http://midhighsolution.com

*/

 

class Router{

 

private $_segment = array();

private $_controller;

private $_method;

private $_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'];

}

Page 11: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

$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

Page 12: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

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 {

Page 13: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

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>

Page 14: 217440308 Membuat MVC Framework PHP Sederhana Sendiri

<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