1 NOVA ROCHAYATI MANAJEMEN INFORMATIKA MCV Pengertian PHP Framework PHP Framework adalah pemrograman PHP dengan menggunkan class library sehingga memp...
MCV Pengertian PHP Framework PHP Framework adalah pemrograman PHP dengan menggunkan class library sehingga mempermudah dalam pembuatan website. PHP Framework Berbasis MVC Sedang PHP Framework berbasis MVC (Model View Control) adalah metode pemrograman PHP dengan menggunkan class library dan membantu untuk memisahkan antara class data dan class logical. Definisi MVC (Model View Control) Model View Controller (MVC) pertama kali diperkenalkan oleh Trygve Reenskaug, pengembang software Smalltalk pada Xerox Palo Alto Research Center pada tahun 1979. Konsep ini membantu memisahkan antara akses data (data access) dengan logika bisnis (business access). Secara lebih detail MVC dibagi menjadi 3 komponen, yaitu : Model, merupakan satu bagian dari MVC, model bertugas untuk berhubungan langsung dengan tugas-tugas CRUD (Create, Read, Update & Delete) pada database, misalnya berhubungan dengan mysql, yang menariknya adalah, framework sudah menyertakan koneksi dengan berbagai jenis database, mulai dari mysql, postgree, oracle, mssql server, dan lain-lain sebagainya, kita tinggal memasukkan nama databasenya dan atribut-atribut seperti host, username, dan passwordnya saja. Sungguh luar biasa lagi, karena seorang koder tidak lagi melakukan hal-hal klasik melulu dilakukan setiap mengawali koding. Bukan hanya konektivitas dengan database
saja, tapi seperti yang saya bicarakan lagi, tugas-tugas create, read, update & delete jauh lebih cepat, mudah, efisien, dan luar biasa. View, jika model berhubungan dengan tugas-tugas database, maka view dikerjakan oleh sang web designer, karena view berisi kode-kode html, css, maupun javascript yang digunakan sebagai tampilan web nantinya. Seorang pembuat view biasanya melakukan pekerjaan dan sedikit berkoordinasi koder intinya, atau bahkan tidak berkoordinasi sama sekali dengan kodernya, tapi hanya mengikuti standarisasi koding framework, sepertinya misalnya pembuatan table data, maupun pagination, dan lain-lain sebagainya. Controller, menjadi tulang punggung koding. Controller yang menghubungkan antara view dan model. Controller yang menghandle inputan dari user. Anggaplah kasusnya seperti user login, ketika tampilan dibuka, controller melihat dari url yang adam kemudian controller mencocokan antara url dengan view yang ada. Jika cocok maka viewnya di tampilkan. Nah misalkan seperti ini, ketika user memasukkan username dan password dan submit, maka controller menerima inputan ini lalu controllerlah yang dia berhubungan langsung dengan model (database) untuk mencocokan apakah yang username dan password yang ada dalam database itu ada dan cocok, controller lah yang menghandle ini semua, yang kemudian jika cocok, maka tugas selanjutnya adalah dilimpahkan kepada view, untuk memperlihatkan tampilan selanjutnya. http://irwin.web.id/
Struktur File MVC Diperlukan beberapa direktori untuk membagi komponen-komponen pada kerangka MVC. Pada tutorial ini kerangka MVC seperti berikut :
Kerangka diatas bagian utama MVC (model-view-controller) ditambah direktori configs untuk konfigurasi database atau lainnya ditempatkan dalam satu direktori application . Lalu untuk PHP function dan kelas libray pada direktori library, terakhir menempatkan web template, style css, gambar, dokumen javascript dan halaman utama index pada direktori public. Titik akses utama MVC adalah index.php, pada dasarnya dalam mvc ini kita hanya mengambil halaman dengan menggunakan GET di index.php public/index.php?page=$1
Dikarenakan file index.php terletak di direktori public diperlukan .htacces untuk mendirect halaman utama index.php di direktori public.Selain itu .htacces berguna untuk menyembunyikan index.php di url dan menciptakan url SEO frendly seperti ini : http:// example.com/product/view/buku-php
Sebelum menggunakan .htaacess kita harus aktifkan modul rewrite atau mod_rewrite pada server apache. Jika anda pakai WAMP caranya mudah untuk aktifkan module rewrite : > jalankan WAMP > klik ikon wamp di taskbar > pilih menu apache > pilih apache module > cari rewrite_module > pilih/centang (secara otomatis server apache sudah restart) atau cara manual : buka file httpd.conf (..\bin\apache\apache2.x.x\conf\httpd.conf) hilangkan tanda # LoadModule rewrite_module modules/mod_rewrite.so
Restart server apache Setelah module rewrite aktif, sekarang buat file .htacces pada direktori utama (mvc) tuliskan kode berikut : RewriteEngine On RewriteCond %{REQUEST_URI} ="" RewriteRule ^.*$ /public/index.php [NC,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ public/index.php?page=$1 [NC,L] Library dibagi menjadi tiga direktori sesuai dengan tipenya, yakni Core adalah kelas library utama/inti untuk membangun MVC, Db untuk kelas library database dan Helper untuk kelas library bantuan. Karena bahasan utama tutorial ini adalah membuat kerangka MVC, untuk sementara kelas library pada direktori Db dan Helper masih kosong dan dibahas pada tutorial selanjutnya Registry Kelas registry adalah objek untuk menyimpan variabel kedalam registry yang dapat diatur dan diambil dengan magical functions __set dan __get. vars[$index] = $value; } public function __get($index) { return $this->vars[$index];
} ?> Router Kelas Router bertugas untuk mengambil kontroller yang berasal dari url. Url yang sebenarnya terlihat seperti ini : http://mvc/index.php?page=product/view/2
Karena menggunakan .htacces dan module rewrite terlihat seperti ini : http://mvc/product/view/2
Terlihat nilai setelah host atau variabel page adalah product/view/2 disni bisa didefinisikan :
Parameter pertama (product) adalah kontroller
Parameter kedua (view) adalah aksi/method
Parameter ketiga dan sterusnya disebut atribut
Router.php
public $route; public $controller; public $action; public function __construct($registry) { $this->registry = $registry; } ... Definisikan variabel registri saat kelas route dipanggil. Kemudian buat method untuk mendaftarkan path/letak kontroller ... public function setPath($path) { if (is_dir($path) == false) { throw new Exception ('Invalid controller path: `' . $path . '`'); } $this->path = $path; } ... Kontroller diambil dari nilai variabel page dan mengatur nilai default jika kontroller kosong adalah kontroller index, begitu juga untuk aksi jika kosong adalah aksi index
$this->file = $this->path .'/'. ucfirst($this->controller) . 'Controller.php'; } ... Mengambil path/letak kontroller pada method loader. Apabila file tidak temukan akan dialihkan ke kontroller page dan aksi notfound atau dapat diartikan halaman tidak ditemukan (404) ... public function loader() { $this->getController(); if (is_readable($this->file) == false){ $this->file = $this->path.'/PageController.php';
$this->controller = 'page'; $this->action = 'notfound'; //404 } include $this->file; $class = $this->controller . 'Controller'; $controller = new $class($this->registry); if (is_callable(array($controller, $this->action)) == false){ $action = 'index'; } else{ $action = $this->action; } $controller->$action(); } // ambil nilai atribut public function getQuery() { return end($this->route); } } ?>
BaseController Kelas BaseController adalah kelas abstrak yang menjadi basis dari semua kelas kontroller. Ketika kelas ini dipanggil (__construct) mendefeinisikan kelas registry dan variabel view yang diambil dari registry untuk kelas kontroller. Dan mengirimkan nilai variabel view untuk template ketika telah selesai dipanggil (__destruct). Kelas ini memiliki method abstrak index, yang artinya setiap kelas kontroller harus memilki method index. BaseController.php _registry = $registry; $this->view = $registry->template; } public function __destruct() { $this->view->dispatch(); } abstract public function index(); }
?> Template Kelas Template bertugas untuk mengatur template dan mengirimkan nilai yang diatur pada kontroller Template.php _registry = $registry; } public function __set($index, $value) { $this->vars[$index] = $value; } ...
Buat registri saat kelas ini dipanggil dan set variabel menggunakan method __set. Method untuk atur untuk path/letak template ... public function setPath($path) { if (is_dir($path) == false) { throw new Exception ('Invalid template path: `' . $path . '`'); } $this->path = $path; } ... Membuat method yang memungkinkan untuk mengambil template yang lain seperti header, footer, atau sidebar jika dibutuhkan. ... public function load($file) { foreach ($this->vars as $key => $value){ $$key = $value; } include $this->path . '/' . $file; } ...
Jika kita tidak ingin menampilkan template untuk tujuan yang lain seperti mengirimkan data json ataupun xml. 1... 2
public function setNoRender($norender = true)
3
{
4
$this->_norender = $norender;
5
}
6...
Yang terakhir mengrimkan nilai-nilai dari kontroller, kemudian tampilkan template ...
if (file_exists($body) == false){ throw new Exception('Template not found in '. $body);
12
return false;
13
}
14
include ($body);
15
}
16} 17?> 18 19 20 21 22
Autoloader Kelas Autoloader ini diambil dari Anthony Bush gunanya untuk mengambil semua kelas library yang didefinisikan pada direktori yang berbeda sekalipun secara bersamaan, sangat efisien jika memiliki library yang banyak. Semua direktori yang didaftarkan disimpan kedalam cache dengan serialize, dan ketika dipanggil mengambilnya dengan unserialize cache tersebut. Functions Kita juga bisa mendefinisikan fungsi-fungsi sederhana yang dibutuhkan, seperti membuat fungsi untuk mengambil path dan membuat url. 1
3 { 4
$base = array(
5
'css' => '/css',
6
'js' => '/js',
7
'img' => '/images'
8
);
9
$path = ($key) ? $base[$key] : '';
10
print URL . '/public' . $path;
11} 12function getUrl() 13{ 14
$args = func_get_args();
15
print URL . '/' . join('/', $args);
16} 17?> 18 19 20
Index Seperti dikatakan sebelumnya file index adalah titk akses utama MVC, dengan demikian kita bisa mendeklarasikan variabel dan konfigurasi
1
Variabel global untuk path direktori utama (root) dan url 1 ... 2 $site_path = realpath(dirname(dirname(__FILE__))); 3 define ('ROOT', $site_path); 4 $base_url = 'http://' . $_SERVER['HTTP_HOST']; 5 define ('URL', $base_url); 6 ... 7
Memuat semua kelas library dengan kelas Autoloader. Pertama atur letak file untuk menyimpan direktori kelas kedalam cache, kemudian mengatur letak direktori kelas. 1 ... 2 include ROOT . '/library/Autoloader.php'; 3 include ROOT . '/library/Functions.php'; 4 Autoloader::setCacheFilePath(ROOT . '/library/cache.txt'); 5 Autoloader::setClassPaths(array( 6
ROOT . '/application/models/',
7
ROOT . '/library/Core/',
8
ROOT . '/library/Db/',
9
ROOT . '/library/Helper/'
10)); 11Autoloader::register(); 12... 13 14
Mendaftarkan objek template dan router ke registry, serta atur letak direktori yuntuk template dan kontroller. 1 2 ... 3 $registry = new Registry; 4 $registry->template = new Template($registry); 5 $registry->template->setPath(ROOT . '/application/views'); 6 $registry->router = new Router($registry); 7 $registry->router->setPath(ROOT . '/application/controllers'); 8 $registry->router->loader(); 9 ?> 10
11 12 13
Model Pada dasarnya kelas model ditugaskan untuk mengolah data. Walaupun tidak memakai database, bukan berarti model tidak bisa digunakan. Sebagai gantinya disini kita gunakan data array, hanya untuk menunjukan bagaimana Model bekerja pada MVC Category Category.php 1
public static function getData()
5
{
6 7
$data = array( array(
8
'id' => '1',
9
'title' => 'kategori1'
10
),
11
array(
12
'id' => '2',
13
'title' => 'kategori2'
14
)
15
);
16
return $data;
17
}
18} 19?>
Product Product.php 1
public static function getData()
5
{
6 7
$data = array( array(
8
'id' => '1',
9
'id_cat' => '1',
10
'title' => 'produk1',
11
'description' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat'
12
),
13
array(
14
'id' => '2',
15
'id_cat' => '2',
16
'title' => 'produk2',
17
'description' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
18
nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat'
19 20
), array(
21
'id' => '3',
22
'id_cat' => '1',
23
'title' => 'produk3',
24
'description' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
25nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat' 26
),
27
array(
28
'id' => '4',
29
'id_cat' => '2',
30
'title' => 'produk4',
31
'description' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
32nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat' 33
)
34
);
35
return $data;
36
} } ?>
Controller Sebuah kontroller adalah pewarisan dari kelas abstrak BaseController. Perlu diperhatikan bahwa setiap kontroller harus memiliki method index karena telah didefinisikan sebelumnya pada kelas abstrak. Kontroller bertugas mengatur aktifitas dan data apa saja yang dikirimkan pada setiap aksi/method untuk tampilan (view). IndexController Kelas IndexController memiliki satu aksi yaitu index bertugas untuk menampilkan semua data kategori yang diambil dari model kategori. Karena method getData di model Category bersifat static, cara pemanggilannya seperti berikut : 1Category::getData();
IndexController.php 1
4 5
public function index()
6
{
7
$this->view->title = 'Kategori';
8
$this->view->data = Category::getData();
9
}
10} 11?> 12
ProductController Kelas ProductController mengikuti cara yang sama, tetapi memiliki beberapa aksi tambahan untuk menunjukan aksi selain index dapat dipanggil. ProductController.php 1
public function index()
5
{
6
$this->view->title = 'Buku';
7
$this->view->data = Product::getData();
8
}
9...
Aksi category bertugas untuk mengatur produk berdasarkan kategori dan aksi view mengatur produk yang dipilih, keduanya memerlukan nilai atribut sebagai id yang dikirmkan oleh url : http://mvc/product/category/1 // atau http://mvc/product/view/2
Untuk mengambil nilai atribut pada url tersebut menggunakan method getQuery() kelas router 1 ... 2
PageController Menampilkan pesan “page not found” jika halaman atau kontroller tidak ditemukan PageController.php 1
public function index()
6
{
7 8
}
9 10
public function notfound()
11
{
12
$this->view->title = 'Not Found';
13
$this->view->message = 'Not Found';
14
}
15 16} 17?>
View Untuk tampilan (view) harus menyesuaikan sesuai dengan kontroller (direktori) dan methodnya (file). Maksudnya jika kita mempunyai kontroller produk, lalu kontroller tersebut memiiki method index, category, dan view, maka diperlukan direktori product dan didalamnya berisikan file method yaitu index.php, category.php dan view.php Melihat beberapa kontroller dan method yang dibuat sebelumnya, direktori views terlihat seperti berikut
:
Efisiensi penggunaan template dengan memisahkan template bersifat global seperti header, footer, ataupun sidebar jika diperlukan, ditempatkan di direktori views. Pertama buat styles sederhana styles styles.css Show » 1
Untuk memakai template header dan footer pada template body pada view menggunakan method load kelas template. 1$this->load('header.php'); 2/*** body ***/ 3$this->load('footer.php');
Index Sekarang buat template body untuk aksi index IndexController index/index.php
You can put whatever content you like here such as search for your site
6 7
8load('footer.php'); ?>
http://gojayincode.com/ Contoh dasarnya dalam masalah login. Bisanya kita memerlukan 3 script, misalnya. home_login.php, do_login.php dan success_login.php.
Gambar di atas menerangkan secara sederhana bagaimana cara kita login. Pertama kita mengakses script home_login.php di dalam script tersebut terdapat kodingan untuk tampilan terhadap user dan logika bila terjadi kesalahan login user terhadap username dan passwordnya. Lalu di do_login.php terdapat kodingan yang berisikan logika kita apakah username dan
password benar. Bila benar maka halaman akan di direct ke success_login.php bila salah maka kita kembalikan ke home_login.php dengan pesan errornya. Untuk melakukan hal tersebut kita memerlukan 3 script. Lalu bagaimana bila kita melakukan hal-hal yang lain ? Seperti fitur-fitur yang ada di website e-commerce, website yang lebih kompleks lainnya ? Tentu memiliki banyak script yang diperlukan. Lalu bagaimana kita memanage script-script yang sebegitu banyak ? Ditambah lagi kodingan untuk tampilan dicampur aduk dengan proses database-nya dan alur logikanya. Hal tersebut akan mempersulitkan kita untuk melakukan pengembangan karena script-script tersebut memiliki kodingan mati. Hal tersebut dapat kita temukan solusinya bila kita menggunakan arsitektur MVC atau Model-ViewController. Dengan model kita dapat membagi mana script untuk proses model database, script untuk tampilan atau view, lalu untuk mengontrol dua hal tersebut kita memerlukan sebuah controller atau bisa kita gunakan untuk alur logikanya. Sesuai dengan yang kita bahas sebelumnya. MVC merupakan kepanjangan dari Model-ViewController. Dimana bagian Model, View dan Controller memiliki fungsinya masing-masing. Keuntungan dengan menggunakan MVC adalah kita dapat mengelompokan script-script sesuai dengan fungsinya, mudah untuk di kembangkan karena untuk membuat MVC kita pasti akan membuat beberapa class yang nantinya akan kita buat menjadi beberapa objek. Sehingga kita dapat memaksimalkan konsep Object Oriented Programming atau kita sebut OOP. http://inovasimuda.com/ Controller dan View Berikut adalah contoh View (system/application/views/my_view.php): [sourcecode language="php"] Beberapa teks biasa. Anda bisa menggunakan HTML. Menampilkan variabel yang dikirim dari controller: Anda juga bisa melakukan loop:
echo "Counter: $i “; } ?> Atau dengan sintaks alternatif: Counter:
[/sourcecode] Berikut adalah contoh controller (system/application/controllers/sample_controller.php), yang me-load sebuah view: [sourcecode language="php"] class Sample_controller extends Controller { function index() { $data = array(); $data['message'] = “index telah dipanggil”; $data['another_message'] = “blah blah”; $this->load->view(„my_view‟,$data); } } [/sourcecode] Kedua url berikut dapat digunakan: http://localhost/ci_doctrine/index.php/sample_controller/index http://localhost/ci_doctrine/index.php/sample_controller Browser akan menampilak seperti di bawah ini:
Beberapa teks biasa. Anda bisa menggunakan HTML. Menampilkan variabel yang dikirim dari controller: index telah dipanggil blah blah Anda juga bisa melakukan loop: Counter: 0 Counter: 1 Counter: 2 Atau dengan sintaks alternatif: Counter: 0 Counter: 1 Counter: 2 http://www.teknojurnal.com/