link pak mesran

Rabu, 26 Juni 2013

Tutorial Membangun Sistem Core


Membuat framework PHP berbasis Model View Controller(MVC) ternyata tidak terlalu sulit.Pada tahap ini akan dijelaskan tata cara pembuatan Controller,View dan struktur lainnya seperti Loader, Register Object dan sebagainya. Sebelum kita mulai pembuatan framework-nya, alangkah lebih baik dijelaskan terlebih dahulu apa latar belakang framework MVC.
Dilihat dari sejarahnya sebenarnya konsep MVC ini sudah ada sejak lama. Konsep MVC ini pertama kali diperkenalkan oleh para peneliti XEROX PARC yang bekerja dalam pembuatan bahasa pemrograman Smalltalk sekitar tahun 1970-1980. Pada dasarnya MVC adalah sebuah metode untuk membuat sebuah aplikasi dengan memisahkan data (Model), tampilan (View) dan cara bagaimana memprosesnya (Controller).
Sampai saat ini framework yang dalam aplikasi website kebanyakan berbasis arsitektur MVC, misalnya CodeIgniter, Simphony, Kohana, cakePHP dan lain sebagainya. Kebanyakan framework yang ada sekarang ini bersifat open source sehingga siapapun bisa mengembangkannya sesuai dengan kebutuhan.Gambar disamping ini menjelaskan bagaimana konsep dasar struktur framework MVC.
Sesuai dengan namanya konsep MVC terbagi menjadi tiga bagian yaitu Controller, Model dan View. Controller berfungsi sebagai sarana komunikasi (input/output) ke browser. Jadi setiap pengguna melakukan komunikasi dengan aplikasi web site pastinya pengguna tersebut berinteraksi dengan controller. Model berfungsi untuk input/output ke database. Sedangkan view adalah sekumpulan tampilan baik itu HTML, CSS, Javascript dan lain sebagainya.
Dalam tulisan kali ini sengaja di buat tema "Hierachical Framework MVC", memang framework ini mendukung banyak aplikasi dalam satu framework. Jadi slogan yang diusung adalah "One Framework Many application". Nah untuk membedakan aplikasi website satu dengan yang lain disusunlah model hierarki. Konsep inilah yang membedakan framework ini dengan konsep framework CodeIgniter.
Tole : "Pakdhe..Pakdhe..coba sampean lihat gambarnya...kok mirip seperti becak ya? laugh"
Pakdhe :"Huss...gimana to?kok mirip becak?apa gara-gara ada 3 bagian itu?oalah..imajinasi sampean itu lho,kok ya aneh-aneh saja"
Tole :"Lha ya itu, coba to sampean perhatiin lagi...bener kan mirip becak?"
Pakdhe :"Whooo..iya ya...bener sampean, kalau tak perhatikan dengan seksama memang mirip becak je.Ya sudah kalau begitu framework yang kita bikin nanti kita namakan becak aja, piye?setuju nggak sampean?"
Tole : "wheladalah...setuju buanget Pakdhe...Becak MVC Framework made in Pakdhe Sakiyun, keren kan Pakdhecheeky"
Dari percakapan antara si Pakdhe Sakiyun dan Tole Dulkamit inilah, akhirnya muncul inspirasi tentang penamaan framework yang dibangun ini. Dari hasil diskusi yang panjang lebar dan tentunya disertai dengan proses semedi yang lama, maka framework ini sepakat dinamakan "Becak Model View Controller" atau disingkat "Becak MVC"
OK,kita lanjutkan saja. Secara garis besar cara kerja framework kita ini dapat dilihat pada gambar dibawah ini.
Nah..pada implementasinya, framework yang akan kita bangun nanti terdiri dari 5 sub sistem yaitu : sub sistem core, databases, libraries, helpers dan aplication(controllers, models dan views versi pengembang aplikasi website). Secara umum gambaran diagramnya terlihat seperti gambar dibawah ini. Hanya saja dalam tulisan kali ini saya akan konsentrasi ke pembangunan sistem core saja. Untuk sub sistem yang lain akan saya bahas dilain waktu.
Adapun susunan folder keseluruhan dari framework ini terlihat seperti pada gambar disamping ini. Pada sub folder system (lingkaran nomor 1, warna hijau) terdapat 3 buah sub folder penting yaitu sub folder core, database, helpers dan libraries. Didalam ketiga folder iniliah letak program inti dalam framework kita.
Jika secara keseluruhan framework ini saya analogikan sebagai mobil, maka sistem core ini ibaratnya seperti mesinnya. penggerak utama dari keseluruhan sistem dalam framework ini adalah sistem core. Sedangkan database, library dan helper adalah fungsi-fungsi tambahan sebagai pelengkap dari keseluruhan sistem. Untuk database, library dan helper akan saya bahas pada artikel yang lain. Untuk saat ini kita konsentrasi ke sistem core saja.
Sedangkan sistem application (lingkaran 2 warna merah) fungsinya untuk apa? pada application inilah nantinya aplikasi web yang dikembangkan oleh pengguna framework ini berada. Jadi pada intinya Ibarat ingin membuat sebuah mobil, para pengembang aplikasi web itu tidak perlu lagi capek-capek membuat semua komponen mobil mulai dari awal. Mereka cukup memanfaatkan dan merangkai fasilitas-fasilitas yang sudah tersedia menjadi sebuah mobil. Dengan konsep kerja semacam ini tentunya siapapun akan lebih mudah dalam mengembangkan sebuah aplikasi web. Hanya saja tata cara pembuatan web tersebut tentunya harus mengikuti aturan main yang distandarisasikan oleh pengembang framework.
Jadi kesimpulannya framework ini boleh dimanfaatkan sebebas-bebasnya untuk membuat aplikasi apapun asalkan para pengembang aplikasi web bersedia mengikuti aturan mainnya pakdhe Sakiyun. Aturan mainnya bagaimana? gampang...sediakan saja sebungkus kopi dan segelas rokok pasti beres urusannya :D
OK, kembali lagi ke sistem core, sebenarnya class yang paling pokok dalam sistem core tersebut adalah class controller. Class controller inilah nantinya akan diturunkan (extends) ke semua class controller yang dibuat oleh pengembang web site. Perlu kita pahami bahwa tugas utama class controller adalah memuat (loaded) semua object yang dibutuhkan oleh sistem, seperti misalnya library, helper, database, view, plugins dan lain sebagainya. Oleh karena itu agar codingnya tidak terlalu panjang maka fungsi-fungsi untuk memuat berbagai macam object tersebut kita tuliskan kedalam class loader. Secara umum desain class diagram sistem core ini terlihat seperti gambar dibawah ini.
Tole :"Pakdhe...kok kayaknya rumit ya?apa memang framework itu rumit?"
Pakdhe :"Yang rumit apanya Tole?ini kan baru pengantarnya saja, Pakdhe belum bahas programnya lho"
Tole :"Waduh...pengantarnya saja sudah bikin saya pusing Pakdhe, apalagi programnya
Pakdhe "Sabar Tole, diikuti saja dulu nanti kan lama-lama ngerti juga.Makanya dengerin Pakdhe cerita dulu biar nggak pusing

OK. Pertama-tama coba saya bahas bagaimana membangun modul core terlebih dahulu. Sebelum dilanjut ke desain sistem, perlu saya jelaskan terlebih dahulu struktur directory modul core-nya. Lihat gambar disamping. Perhatikan letak directory modul core (lingkaran nomor 1). Sedangkan global_controller.php (lingkaran nomor 2) akan saya bahas lebih lanjut pada sub bagian 7 pada artikel ini. Pada folder system/core tersebut terdapat 6 program yaitu :
  1. base
  2. bootstrap
  3. common
  4. controller
  5. loader
  6. model
1. base.php
class base ini berfungsi untuk digunakan untuk menyimpan instance object. Dalam susunan hierarki, base class ini menempati urutan tertinggi atau dapat diistilahkan root class. Tidak ada yang istimewa dalam class ini. Hanya saja fungsi dasarnya adalah menukarkan isi variable object itu sendiri ($this) ke variable $instance. Berikut ini script class base yang saya maksud.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : base.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : class base adalah class yang digunakan untuk menyimpan instance object 
  9. */  
  10. class base {  
  11.     private static $instance;  
  12.     public static $helpers = array();  
  13.     public static $models = array();  
  14.     public static $databases = array();  
  15.   
  16.     public function __construct(){  
  17.         self::$instance = &$this;  
  18.     }  
  19.     public static function getInstance(){  
  20.         return self::$instance;  
  21.     }  
  22. }  
  23.   
  24. function this(){ return base::getInstance(); }  
  25. ?>  
2. bootstrap
Bootstrap ini bukan sebuah class. program ini berfungsi hanya untuk meng-include-kan/memanggil program-program penting lain yang diperlukan oleh aplikasi. Selain itu bootstrap ini juga berfungsi untuk mengeksekusi controller yang yang dipanggil oleh user.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : becak.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : routine untuk memuat (loaded) system utama serta routine untuk menjalankan default controller 
  9. */  
  10.   
  11. //panggil class inti (core)  
  12.   
  13.   
  14. require (SYS.'constant'.DS.'file.php');   
  15. require (SYS.'core'.DS.'common.php');  
  16. require (SYS .'error'. DS .'errors.php');   
  17. require (SYS.'libraries'. DS .'benchmark_library.php');  
  18. $benchmark = common::register('Benchmark');  
  19. $benchmark->mark('total_execution_time_start');  
  20.   
  21. require (SYS.'core'.DS.'loader.php');  
  22. require (SYS.'core'.DS.'base.php');  
  23. require (SYS.'core'.DS.'controller.php');    
  24. require (SYS.'core'.DS.'model.php');  
  25.   
  26. require (SYS.'libraries'.DS.'router_library.php');    
  27. require (SYS.'libraries'.DS.'uri_library.php');  
  28. require (SYS.'libraries'.DS.'output_library.php');  
  29. require (SYS.'libraries'.DS.'config_library.php');  
  30.   
  31.   
  32. date_default_timezone_set(common::config_item('timezone_set'));  
  33.   
  34. $uri    = common::register('Uri');  
  35. $router = common::register('Router');  
  36. $output = common::register('Output');  
  37.   
  38. if ($output->_display_cache($uri) == TRUE) { exit; }  
  39.   
  40. $GLOBALS['d']   = $router->fetch_directory();   // Get requested directory  
  41. $GLOBALS['c']   = $router->fetch_class();       // Get requested controller  
  42. $GLOBALS['m']   = $router->fetch_method();      // Get requested method  
  43.   
  44. //panggil default controller pada directory application/controller  
  45. if(! file_exists(DIR.$GLOBALS['d'].DS.'controllers'.DS.$GLOBALS['c'].PHP_EXT)) {  
  46.     if($router->query_string)   
  47.         show_404("{$GLOBALS['d']}/{$GLOBALS['c']}/{$GLOBALS['m']}");  
  48.               
  49.         throw new Exception('Unable to load your default controller.Please make sure the controller specified in your Routes.php file is valid.');  
  50. }  
  51. require (DIR.$GLOBALS['d'].DS.'controllers'.DS.$GLOBALS['c'].PHP_EXT);  
  52.   
  53. if ( ! class_exists($GLOBALS['c'])   
  54. OR $GLOBALS['m'] == 'controller'  
  55. OR in_array(strtolower($GLOBALS['m']), array_map('strtolower', get_class_methods('Controller')))  
  56. ){  
  57.     show_404("Class {$GLOBALS['d']}/{$GLOBALS['c']}/{$GLOBALS['m']}");  
  58. }  
  59.   
  60. $MC = new $GLOBALS['c']();  
  61.   
  62. if ( ! in_array(strtolower($GLOBALS['m']), array_map('strtolower', get_class_methods($MC)))){  
  63.     show_404("{$GLOBALS['d']}/{$GLOBALS['c']}/{$GLOBALS['m']}");  
  64. }  
  65.   
  66. call_user_func_array(array($MC$GLOBALS['m']), array_slice($uri->rsegments, 3));  
  67.   
  68. $output->_display();  
  69.   
  70. while (ob_get_level() > 0) { ob_end_flush(); }  
  71. ?>  
3. Common
Class common ini berisi penanganan fungsi-fungsi umum misalnya register object, membaca configurasi dan operasi file. Telah disinggung diatas bahwa tugas dari class loader adalah memuat berbagai macam object yang dibutuhkan oleh sistem. Dalam class ini ada 2 (dua) function yang sangat penting yaitu singleton dan register. Apa itu singleton dan register? ada sub bab class Loader dibawah akan saya ulas lebih lanjut.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : common.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : class umum 
  9. */  
  10.   
  11. //class registry digunakan untuk mendaftarkan variable menjadi object  
  12. class common {  
  13.     private static $object  = array();  
  14.     private static $instance;  
  15.   
  16.     //singleton  
  17.     private static function singleton(){  
  18.         if(!isset(self::$instance))  
  19.             self::$instance = new self();  
  20.         return self::$instance;   
  21.     }  
  22.     private function get($id){  
  23.         if(isset(self::$object[$id])){  
  24.             return self::$object[$id];  
  25.         }  
  26.         return NULL;  
  27.     }  
  28.     private function set($id$value){  
  29.         self::$object[$id] = $value;  
  30.     }  
  31.     private static function getObject($id) {  
  32.         return self::singleton()->get($id);  
  33.     }  
  34.     private static function setObject($id$instance){  
  35.         return self::singleton()->set($id$instance);  
  36.     }  
  37.       
  38.     private static function get_static($filename = 'config'$var = ''$folder = '')  
  39.     {  
  40.         static $static = array();  
  41.   
  42.         if ( ! isset($static[$filename]))  
  43.         {  
  44.         if ( ! file_exists($folder. DS .$filename. PHP_EXT))   
  45.             throw new Exception('The static file '. DS .$folder. DS .$filename. PHP_EXT .' does not exist.');  
  46.           
  47.         require($folder. DS .$filename. PHP_EXT);  
  48.           
  49.         if($var == ''$var = &$filename;  
  50.           
  51.         if ( ! isset($$var) OR ! is_array($$var))  
  52.         {  
  53.             throw new Exception('The static file '. DS .$folder. DS .$filename. PHP_EXT .' file does not appear to be formatted correctly.');  
  54.         }  
  55.           
  56.         $static[$filename] =& $$var;  
  57.          }  
  58.            
  59.         return $static[$filename];      
  60.     }  
  61.     public static function get_config($filename = 'config'$var = '')  
  62.     {  
  63.         return self::get_static($filename$var, APP. DS. 'config');  
  64.     }  
  65.   
  66.     /* Fungsi register digunakan untuk mendaftarkan variable menjadi object.*/  
  67.     public static function register($ClassName){  
  68.         $Obj = self::singleton();  
  69.         $ClassName = strtolower($ClassName);  
  70.         if($Obj->getObject($ClassName) != NULL){  
  71.             return $Obj->getObject($ClassName);    
  72.         }   
  73.         $Class = $ClassName;  
  74.         $Obj->setObject($ClassNamenew $Class());  
  75.         $Object = $Obj->getObject($ClassName);  
  76.         if(is_Object($Object)) return $Object;  
  77.     }  
  78.     public static function config_item($item$config_name = 'config')  
  79.     {  
  80.         static $config_item = array();  
  81.   
  82.         if ( ! isset($config_item[$item]))  
  83.         {  
  84.         $config_name = self::get_config($config_name);  
  85.         if ( ! isset($config_name[$item])) return FALSE;  
  86.           
  87.         $config_item[$item] = $config_name[$item];  
  88.         }  
  89.         return $config_item[$item];  
  90.     }  
  91.     public static function is_really_writable($file)  
  92.     {      
  93.         // If we're on a Unix server with safe_mode off we call is_writable  
  94.         if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)  
  95.         {  
  96.         return is_writable($file);  
  97.         }  
  98.   
  99.         // For windows servers and safe_mode "on" installations we'll actually  
  100.         // write a file then read it.  Bah...  
  101.         if (is_dir($file))  
  102.         {  
  103.         $file = rtrim($file'/').'/'.md5(rand(1,100));  
  104.   
  105.         if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)  
  106.         {  
  107.             return FALSE;  
  108.         }  
  109.   
  110.         fclose($fp);  
  111.         @chmod($file, DIR_WRITE_MODE);  
  112.         @unlink($file);  
  113.         return TRUE;  
  114.         }  
  115.         elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)  
  116.         {  
  117.         return FALSE;  
  118.         }  
  119.   
  120.         fclose($fp);  
  121.         return TRUE;  
  122.     }  
  123. }//end class  
  124. ?>  
4. Controller
Seperti yang sudah saya jelaskan diatas, class controller inilah dijadikan induk dari keseluruhan controller yang dibuat oleh user. Pada class ini hanya terdapat konstrktor yang menjalankan function _init, dimana dalam function _init tersebut bertugas mendaftarkan library utama guna mendukung jalannya aplikasi. Apa itu library utama? nanti saya jelaskan di artikel lain yang khusus membahas tentang library.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : controller.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : class controller ini adalah induk dari semua controller 
  9. */  
  10. require(APP .'globals'. DS .'global_controller'. PHP_EXT);   
  11.   
  12. class controller extends global_controller {  
  13.     public function __construct(){  
  14.         parent::__construct();  
  15.         $this->_init();    
  16.     }  
  17.     private function _init()  
  18.         {  
  19.         $Classes = array(                           
  20.                             'config'    => 'Config',  
  21.                             'router'    => 'Router',  
  22.                             'uri'       => 'URI',   
  23.                             'output'    => 'Output'   
  24.                         );  
  25.                           
  26.         foreach ($Classes as $public_var => $Class)  
  27.         {  
  28.             $this->$public_var = common::register($Class);  
  29.         }  
  30.     }  
  31. }//end class  
  32. ?>  
5. Loader
Telah disinggung diatas bahwa tugas class loader adalah memuat berbagai macam object yang dibutuhkan oleh sistem. Namun kenyataannya pada saat memuat sebuah object, bisa saja object yang sama sudah pernah termuat sebelumnya. Jika hal ini dibiarkan maka akan mengakibatkan terjadinya penumpukan inisialisasi object yang sama pada memory. Penumpukan inisialisasi object ini tentu saja mengakitbatkan pemborosan pemakaian memory. Untuk menghindari hal tersebut maka dibutuhkan pola desain (design pattern) singleton yang contoh programmnya sudah saya copy-paste pada sub bab common diatas.

Tugas utama  singleton adalah memastikan bahwa tidak ada object yang sama dimuat lebih dari satu kali. Penghematan penggunaan memory wajib kita lakukan dengan harapan manakala web site kita sudah diakses oleh banyak orang, maka bisa kita minimalisir kemungkinan terjadinya macet (down) web server kita. Pada contoh program yang saya lampirkan, penulisan fungsi singleton ini bisa anda temui pada file common.php. Berikut ini source code class Loader yang saya maksud.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : loader.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : class loader berfungsi untuk memuat (loaded) library, helper, view, model   
  9. */  
  10. class loader {  
  11.     private static $helpers = array();  
  12.     private static $sys_helpers = array();  
  13.     public static function sys_library($library){  
  14.         self::_library($library'system');  
  15.     }  
  16.     public static function app_library($library){  
  17.         self::_library($library'application');  
  18.     }  
  19.     public static function library($library){  
  20.         self::_library($library'directories');  
  21.     }  
  22.     private static function _library($library$folder = 'system'){  
  23.         if($library=='')return false;  
  24.         $library = strtolower($library);  
  25.         switch($folder){  
  26.             case 'system'       : $lib_folder = SYS.'libraries'.DS;break;  
  27.             case 'application'  : $lib_folder = APP.'libraries'.DS;break;  
  28.             case 'directories'  : $lib_folder = DIR.$GLOBALS['d'].DS.'libraries'.DS;break;  
  29.         }  
  30.         if(file_exists($lib_folder.$library.'_library'.PHP_EXT )) {   
  31.             require ($lib_folder.$library.'_library'.PHP_EXT );  
  32.             base::getInstance()->$library = common::register($library);  
  33.         } else throw new Exception("Can't load library file: " . $library);  
  34.     }  
  35.     public static function sys_helper($helper) {  
  36.         self::_helper($helper'system');  
  37.         }  
  38.     public static function app_helper($helper='') {  
  39.         self::_helper($helper'application');  
  40.     }  
  41.     public static function helper($helper =''){  
  42.         self::_helper($helper'directories');  
  43.     }  
  44.     private static function _helper($helper$folder = 'system') {  
  45.         if($helper=='')return false;  
  46.         if( isset(self::$helpers[$helper]) ){  
  47.             return;   
  48.         }  
  49.         $helper = strtolower($helper);  
  50.         switch($folder){  
  51.             case 'system'       : $hlp_folder = SYS.'helpers'. DS;break;  
  52.             case 'application'  : $hlp_folder = APP.'helpers'. DS;break;  
  53.             case 'directories'  : $hlp_folder = DIR.$GLOBALS['d'].DS.'helpers'.DS;break;  
  54.         }  
  55.         if(file_exists($hlp_folder . $helper.'_helper'. PHP_EXT)){  
  56.             include($hlp_folder . $helper.'_helper'. PHP_EXT);  
  57.             self::$helpers[$helper] = $helper;  
  58.             return;      
  59.         } else throw new Exception("Can't load helper file: " . $helper);  
  60.     }  
  61.     public static function app_model($model_name){  
  62.         self::_model($model_name'application');  
  63.     }  
  64.     public static function model($model_name){  
  65.         self::_model($model_name'directories');  
  66.     }  
  67.     private static function _model($model_name$folder = 'system'){  
  68.         if($model_name=='')return;  
  69.         $model_name = strtolower($model_name);  
  70.         $model_var = &$model_name;  
  71.             if (isset(base::getInstance()->$model_var) AND is_object(base::getInstance()->$model_var))  
  72.         { return; }  
  73.         switch($folder){  
  74.             case 'application'  : $mdl_folder = APP.'models'.DS;break;  
  75.             case 'directories'  : $mdl_folder = DIR.$GLOBALS['d'].DS.'models'.DS;break;  
  76.         }  
  77.         if(file_exists($mdl_folder.$model_name.PHP_EXT )) {   
  78.             require ($mdl_folder.$model_name.PHP_EXT );  
  79.             base::getInstance()->$model_var = new $model_name();  
  80.             base::getInstance()->$model_var->_assign_db_objects();  
  81.                 base::$models[$model_var] = base::getInstance()->$model_var;  
  82.         } else throw new Exception("Can't load model file: " . $model);  
  83.     }  
  84.     public static function database($db_name = 'db'){  
  85.         $db_var = $db_name;  
  86.         $obj = base::getInstance();  
  87.         if (isset($obj->{$db_var}) AND is_object($obj->{$db_var}) ) {  
  88.             return;  
  89.         }  
  90.         require (SYS .'database'. DS .'db_factory'. PHP_EXT);  
  91.         $obj->{$db_var} = db_factory::callDB($db_name);  
  92.             base::$databases[$db_var] = $db_var;   
  93.         if (count(base::$models) >= 0) {  
  94.             foreach (base::$models as $model_name)  
  95.                 $obj->$model_name->$db_var = &$obj->$db_var;  
  96.         }  
  97.     }  
  98. }//end class loader  
  99. ?>  
6. Model
Terakhir adalah class model. Class ini difungsikan sebagai induk dari model yang dibuat oleh user. Class model ini sebenarnya hanya berfungsi untuk mendaftar instance database ke base class. Pertanyaannyam kenapa kok instance database tersebut perlu disimpan dan didaftarkan? Framework ini memang didesain mampu mendukung multi connection database. Dikarenakan hal itulah maka masing-masing koneksi perlu disimpan ke memory agar supaya jikalau ada banyak koneksi database yang harus dijalankan,  maka variable koneksi tersebut masih tersimpan di memory dan masih bisa digunakan.

  1. <?php defined('SYS'or exit('Access Denied!');  
  2. /*  
  3. * Becak MVC Framework version 1.0  
  4. * 
  5. * File      : model.php 
  6. * Directory : system/core 
  7. * Author    : Eko Heri Susanto 
  8. * Description   : class model ini adalah induk dari semua model 
  9. */  
  10.   
  11. class model extends base {  
  12.     public function __construct(){  
  13.         $this->_assign_db_objects();  
  14.     }  
  15.     public function _assign_db_objects(){  
  16.         foreach(base::$databases as $key){  
  17.             $this->$key = &base::getInstance()->$key;  
  18.         }  
  19.     }  
  20.       
  21. }//end class model  
  22. ?>  
7. Global controller
Global controller adalah class yang digunakan untuk deklarasi variable-variable global, misalnya base_url, directory resource gambar, CSS, javascript dsb. Atau bisa juga digunakan untuk memanggil library dan helper yang nantinya digunakan pada seluruh aplikasi. Lokasi program global controller pada framework ini tersimpan di folder application/globals(Lihat gambar diatas-lingkaran nomor 2). Global controller ini sebenarnya mempunyai fungsi yang mirip seperti perintah $_GLOBAL. Jadi pada class inilah tempat mendeklarasikan semua variabel-variabel ataupun function yang sifatnya umum.

  1. <?php  defined('SYS'or exit('Access Denied!');  
  2. class global_controller extends base {  
  3.     public $base$base_url$base_img;  
  4.         public $title$head$meta;  
  5.     public $calendar='';  
  6.     public function  __construct(){  
  7.         parent::__construct();  
  8.         loader::sys_helper('view');  
  9.         loader::sys_helper('head_tag');  
  10.         $this->base     = common::config_item('base_url');  
  11.         $this->base_url = common::config_item('base_url')  . common::config_item('index_page');  
  12.         $this->base_img = common::config_item('source_url').'images/';  
  13.         $this->meta     = meta('Content-type''text/html; charset=utf-8''equiv');  
  14.         $this->meta    .= meta('author''Eko Heri Susanto');  
  15.     }  
  16. }  
  17. ?>  
8. Index.php
Tentunya anda sudah paham apa kegunaan dari index.php kan? apa hayo? Index.php adalah file yang secara default akan dijalankan pertama kali ketika ada user (pengguna) yang mengkases web site. Nah ini source code-nya

  1. <?php  
  2. error_reporting(E_ALL | E_STRICT);   
  3. define('DS',   DIRECTORY_SEPARATOR);   
  4. define('SYS',  'system'.DS);   
  5. define('APP',  'application'.DS);  
  6. define('DIR',  APP . 'directories'.DS);  
  7. define('PHP_EXT',  '.php');  
  8. define('SELF'pathinfo(__FILE__, PATHINFO_BASENAME));  
  9. if ( get_magic_quotes_gpc() ) {  
  10.       
  11.     function stripslashes_gpc(&$value){  
  12.         $value = stripslashes($value);  
  13.     }  
  14.       
  15.     array_walk_recursive($_GET'stripslashes_gpc');  
  16.     array_walk_recursive($_POST'stripslashes_gpc');  
  17.     array_walk_recursive($_COOKIE'stripslashes_gpc');  
  18.     array_walk_recursive($_REQUEST'stripslashes_gpc');  
  19. }  
  20. require(SYS .'core'.DS.'bootstrap.php');   
  21. ?>  
Sampai disini pembahasan modul core (inti) selesai. Untuk library routing dan uri tidak saya bahas disini. Silahkan anda ikuti artikel saya berikutnya.

http://www.blogkomputer.com/data-tutorial-membangun-sistem-core.html

Tidak ada komentar:

Posting Komentar