Tuesday, August 7, 2012

Pemrograman Web berbasis Model View Controller(MVC) dalam PHP

Pola(pattern) model view controller(MVC) adalah pola yang paling sering digunakan untuk aplikasi web saat ini di dunia. Pola ini telah digunakan untuk pertama kali dalam Smalltalk dan kemudian diadopsi dan dipopulerkan oleh Java. Pada saat ini terdapat lebih dari belasan framework web PHP berbasis pada pola MVC. Terlepas dari fakta bahwa pola MVC sangat popular dalam PHP, sangat sulit untuk menemukan sebuah panduan/tutorial yang tepat yang disertai oleh sebuah contoh source code yang sederhana. Hal tersebut lah yang menjadi tujuan tutorial ini.
Pola MVC memisahkan sebuah aplikasi dalam 3 modul: Model, View, dan Controller:
-    Model bertanggung jawab untuk mengelola data; model menyimpan dan mengambil entitas yang digunakan oleh sebuah aplikasi, biasanya dari sebuah database, dan berisi logika yang diimplementasikan oleh aplikasi.
-    View(presentasi) bertanggung jawab untuk menampilkan data yang disediakan oleh model dalam sebuah format tertentu. View mempunyai sebuah penggunaan yang sama dengan modul template yang ada dalam beberapa aplikasi web yang popular seperti wordpress, joomla, dll.
-    Controller menangani lapis model dan view agar bekerja sama. Controller menerima sebuah request dari client, memanggil model untuk melakukan operasi yang diminta dan mengirimkan data pada view. View memformat data untuk disajikan pada user, dalam sebuah aplikasi web sebagai sebuah keluaran html.


Gambar di atas berisi diagram kolaborasi MVC, di mana sambungan dan ketergantungan antara gambar bisa diamati.
Contoh singkat php disini mempunyai sebuah struktur sederhana, yang meletakkan tiap modul MVC dalam satu folder yang berbeda:
Controller
Controller adalah hal pertama yang mengambil sebuah request, melakukan parsing terhadap request tersebut, menginisialisasi dan memanggil model dan mengambil sebuah model response dan mengirimkan pada layer presentasi. Controller secara praktis adalah bahan pengikat antara Model dan View, sebuah framework kecil dimana Model dan View dipasang. Dalam implementasi php sederhana kita, controller diimplementasikan oleh hanya satu class yang tidak diduga, dinamakan controller. Titik masuk aplikasi akan berada pada index. File php index akan mengutus semua request pada controller:

    // index.php file
    include_once("controller/Controller.php");

    $controller = new Controller();
    $controller->invoke();
Class Controller yang kita pakai hanya mempunyai satu fungsi dan constructor. Constructor mengintantiasi sebuah class model dan ketika sebuah request dilakukan dan controller memutuskan data mana yang dibutuhkan dari model. Kemudian controller memanggil class model untuk mengambil data. Setelah itu, controller memanggil data yang datang dari model yang dilewatkan yang berpasangan. Code yang dipakai sangat sederhana. Perlu dicatat bahwa controller tidak mengetahui apapun dari database atau bagaimana halaman dihasilkan.
include_once("model/Model.php");

class Controller {
     public $model;  

     public function __construct()
     {
          $this->model = new Model();
     }

     public function invoke()
     {
          if (!isset($_GET['book']))
          {
               // no special book is requested, we'll show a list of all available books
               $books = $this->model->getBookList();
               include 'view/booklist.php';
          }
          else
          {
               // show the requested book
               $book = $this->model->getBook($_GET['book']);
               include 'view/viewbook.php';
          }
     }
}
Dalam Sequence Diagram MVC berikut, bisa dilihat aliran selama sebuah request http:

Class Model dan Entitas
Model mewakili data dan logika dari sebuah aplikasi, yang banyak orang menyebutnya logika bisnis. Biasanya, Model bertanggung jawab untuk:
-    menyimpan, menghapus, dan memperbaharui data aplikasi. Secara umum, model memasukkan operasi database, namun mengimplementasikan operasi yang sama yang memanggil web service luar atau API bukanlah hal yang tidak biasa sama sekali.
-    Membungkus logika aplikasi. Lapis ini adalah lapis yang harus mengimplementasikan semua logika dari aplikasi. Sebagian besar kesalahan umum yaitu mengimplementaskan operasi logika aplikasi didalam lapis controller atau view(presentasi).
Dalam contoh yang kita pakai, model diwakili oleh dua class: class Model dan class Book. Model tidak membutuhkan penyajian lain. Class Book adalah sebuah class entitas. Class ini seharusnya diekspos ke layer View dan menyajikan format yang dikirim oleh tampilan Model. Dalam implementasi pola MVC yang bagus hanya class entitas yang harus diekspos oleh model dan class entitas tersebut tidak seharusnya membungkus logika bisnis apapun. Class entitas mempunyai tujuan utama untuk menyimpan data. Tergantung pada implementasi object entitas bisa digantikan oleh potongan data xml atau json. dalam  cuplikan di atas, anda melihat bagaimana Model mengembalikan sebuah buku tertentu, atau sebuah daftar semua buku yang tersedia:
include_once("model/Book.php");

class Model {
    public function getBookList()
    {
        // here goes some hardcoded values to simulate the database
        return array(
            "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."),
            "Moonwalker" => new Book("Moonwalker", "J. Walker", ""),
            "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "")
        );
    }

    public function getBook($title)
    {
    // we use the previous function to get all the books and then we return the requested one.
    // in a real life scenario this will be done through a db select command
        $allBooks = $this->getBookList();
        return $allBooks[$title];
    }

}
Dalam contoh yang dipakai, layer model memasukkan class Book. Dalam sebuah scenario yang sebenarnya, model akan memasukkan semua entitas dan class-class untuk menahan data ke dalam database, dan class yang membungkus logika bisnis.
class Book {
    public $title;
    public $author;
    public $description;

    public function __construct($title, $author, $description)
    {
        $this->title = $title;
        $this->author = $author;
        $this->description = $description;
    }
}
View (Presentasi)
View atau layer presentasi bertanggung jawab untuk pemformatan data yang diterima dari model dalam sebuah bentuk yang bisa diakses kepada pengguna. data bisa datang dari model berupa object sederhana (kadang-kadang disebut Object Nilai), struktur xml, json, …
View tidak seharusnya membuat bingung dengan mekanisme template, terkadang keduanya bekerja bekerja dengan cara yang sama dan menangani permasalahan yang sama. Keduanya akan mengurangi ketergantungan dari layer presentasi dari keseluruhan sistem dan memisahkan unsur penyajian(html) dari code. Controller mengutus data dari model pada sebuah unsur view tertentu, biasanya berhubungan dengan entitas utama di dalam model. Sebagai contoh, operasi “display account” akan berhubungan dengan sebuah view “display account”. Layer view bisa menggunakan sebuah sistem template untuk menghasilkan sebuah halaman html. Mekanisme template bisa menggunakan kembali bagian tertentu dari halaman: header, menu, footer, list, dan tabel jika kita berbicara dalam konteks pola MVC.
Dalam contoh yang dipakai, view hanya berisi 2 file, satu untuk menampilkan satu buku dan yang lainnya untuk menampilkan sebuah daftar buku.
viewbook.php
<html>
<head></head>

<body>

    <?php

        echo 'Title:' . $book->title . '<br/>';
        echo 'Author:' . $book->author . '<br/>';
        echo 'Description:' . $book->description . '<br/>';

    ?>

</body>
</html>

booklist.php
<html>
<head></head>

<body>

    <table>
        <tbody><tr><td>Title</td><td>Author</td><td>Description</td></tr></tbody>
        <?php

            foreach ($books as $title => $book)
            {
                echo '<tr><td><a href="index.php?book='.$book->title.'">'.$book->title.'</a></td><td>'.$book->author.'</td><td>'.$book->description.'</td></tr>';
            }

        ?>
    </table>

</body>
</html>

Contoh di atas adalah sebuah implementasi sederhana dalam PHP. Sebagian bear framework web PHP yang berbasis pada MVC mempunyai implementasi berbeda namun dalam sebuah bentuk yang lebih baik. Namun, kemungkinan pola MVC tidak terbatas. Sebagai contoh layer yang berbeda bisa diimplementasikan dalam bahasa yang berbeda atau tersebar pada mesin yang berbeda. Aplikasi AJAX bisa mengimplementasikan layer view secara langsung dalam Javascript dalam browser, yang memanggil layanan JSON. Controller bisa secara parsial diimplementasikan pada client dan sebagiannya lagi di server.
Post ini tidak seharusnya diakhiri sebelum menyebut keuntungan dari pola Model View Controller:
-    Model dan View terpisah yang membuat aplikasi lebih fleksibel.
-    Model dan View bisa diubah secara terpisah, atau diganti. Sebagai contoh sebuah aplikasi web bisa diubah dalam sebuah aplikasi client yang cerdas hanya dengan menuliskan sebuah module View baru, atau sebuah aplikasi bisa menggunakan web service di backend dari pada menggunakan sebuah database, hanya dengan mengganti modul model.
-    Tiap modul bisa diuji dan di-debug secara terpisah.
Sumber:
http://php-html.net/tutorials/model-view-controller-in-php/

source code bisa didownload di sini


No comments:

Post a Comment