Mengenal MVC pada PHP

Mengenal MVC pada PHP

Apa itu MVC?

MVC atau (Model View Controller) adalah sebuah konsep pemrograman atau desain pattern yang dirancang untuk mempermudah programmer dalam pembuatan sebuah proyek dengan memisahkan antara model, view dan controller agar susunan direktori atau folder lebih teratur dan terorganisasi guna mempermudah tahap pengembangan selanjutnya. Sebelum mengenal MVC pada PHP lebih lanjut, tidak ada salahnya jika kita mengenal apa itu Model, View dan Controller. Model adalah konsep pemetaan data dalam bentuk object dan model biasanya dibuat untuk menyajikan data dalam sebuah storage. Sementara itu, View adalah proses mengolahan data dari model kedalam bentuk layout atau template. Controller adalah tahap dimana perintah awal diterima sebelum program dieksekusi. Masing-masing komponen dalam MVC memiliki peran yang penting.

MVC pada PHP dalam bentuk aplikasi sederhana.

Flow MVC pada PHP

Memulai MVC dengan PHP dari scratch

Konsep MVC pada PHP biasanya sering ditemukan dalam sebuah framework PHP, tapi bagi kamu yang baru mengenal MVC, kamu bisa mencoba memulai membuat proyek kecil dengan PHP tanpa framework. Susunan folder pada MVC itu sendiri tidak diwajibkan menggunakan nama Model, View dan Controller namun hal ini direkomendasikan. Berikut ini merupakan contoh susunan folder MVC pada PHP.

Language: text
1
2
3
4
5
6
7
8
9
10
11
- Controller/
  - UserController.php
  - ...
- Model/
  - UserModel.php
  - ..
- View/
  - UserFormView.php
  - UserListView.php
  - ..
- index.php   <-- berfungsi sebagai router

Jika dilihat dari contoh susunan diatas, setiap Model, View dan Controller berfungsi untuk proses input dan output data pada object user. Input yang dimaksud disini adalah request atau permintaan yang dikirim dari URL melalui router ke controller dan Output yang dimaksud adalah interface yang dihasilkan oleh view dengan data yang dikirim oleh model.

Mempersiapkan Controller

Dalam file Controller/UserController.php dapat terdiri dari satu Class dan beberapa Method dan setiap method yang bersifat public pada controller tersebut dapat diakses melalui router. Berikut ini contoh isi dari file Controller/UserController.php.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// file Controller/UserController.php
 
class UserController
{
    public function index()
    {
        // ... tampilkan list user disini nanti
    }
 
    public function form($id = null)
    {
        // ... tampilkan form user disini nanti
    }
}

Dalam file Controller/UserController.php terdiri dari dua public method yaitu index() dan form(). Method index() nantinya akan difungsikan untuk merequest data ke model user sementara method form() berfungsi untuk menampilkan form insert dan edit user maka dari itu diperlukan parameter $id pada method form().

Mempersiapkan Model

Setelah controller disiapkan, langkah selanjutnya adalah mempersiapkan isi dari file Model/UserModel.php. Berikut ini adalah contoh isinya.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
// file Model/UserModel.php
 
class UserModel
{
    private $userList = array();
 
    public function __construct()
    {
        $storage = isset($_COOKIE['user']) ? $_COOKIE['user'] : null;
        
        if (!$storage || ($storage && empty($this->userList = unserialize($storage)))) {
            $this->userList[1] = array("name" => "Hendry", "age" => 21);
            $this->userList[2] = array("name" => "Diana", "age" => 19);
        }
    }
 
    public function getAll()
    {
        return $this->userList;
    }
 
    public function save()
    {
        setcookie('user', $_COOKIE['user'] = serialize($this->userList));
    }
}

Pada model user diatas terdapat satu method yaitu getAll() yang akan difungsikan untuk menampilkan data user secara dummy.

Mempersiapkan View

Setelah model dipersiapkan langkah selanjutnya adalah membuat view pada file View/UserListView.php dan router pada file index.php.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
<!-- file View/UserListView.php -->
<h1>User List</h1>
<a href="?controller=UserController/form">+ Add new</a>
<ol>
    <?php foreach ($userList as $id => $userData): ?>
    <li>
        <a href="?controller=UserController/form/<?php echo $id ?>">
            <?php printf("%s, %s years old", $userData['name'], $userData['age']) ?>
        </a>
    </li>
    <?php endforeach ?>
</ol>

Pada file View/UserListView.php bisa dilihat bahwa didalam proses looping terdapat link menuju class UserController dengan method form() dan parameter $id secara dinamis yang nantinya akan mengarahkan pengguna aplikasi untuk menuju halaman edit selain itu juga perlu disediakan link untuk menuju halaman edit data user.

Mempersiapkan router

Langkah selanjutnya adalah mempersiapkan router pada file index.php sebagai endpoint untuk penerima request dari url dan pengirim response ke browser.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// file index.php
 
require "Controller/UserController.php";
require "Model/UserModel.php";
 
$params = isset($_GET['controller']) ? $_GET['controller'] : null;
if (null === $params) {
    die("Page not found!");
}
 
@list($controller, $method, $id) = explode("/", $params);
if (!class_exists($controller) || (class_exists($controller) && !method_exists($controller, $method))) {
    die("Page not found!");
}
 
call_user_func_array(array(new $controller(), $method), array($id));
 

Perlu diingat bahwa method index() pada class UserController masih kosong sehingga akan menghasilkan blank output maka dari itu kita perlu menambahkan sedikit kode pada method index(). Lihat contoh dibawah.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// file Controller/UserController.php
 
class UserController
{
    public function index()
    {
        $userModel = new UserModel();
        $userList = $userModel->getAll();
 
        require 'View/UserListView.php';
    }
 
    // ... kode selanjutnya
}
 

Sekarang program siap untuk dieksekusi melalui url contohnya http://localhost/mvc/index.php?controller=UserController/index. Berikut ini contoh output dari controller UserController/index.

Contoh MVC 1

 

 

 

 

 

 

Memanipulasi data secara dinamis dengan MVC

Untuk memanipulasi data melalui controller kita harus menambahkan sedikit kode PHP pada file Model/UserModel.php dan Controller/UserController.php serta membuat kode dalam file View/UserFormView.php. Berikut contoh tambahan kode PHP pada file Model/UserModel.php.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// file Model/UserModel.php
 
class UserModel
{
    // ... kode sebelumnya
 
    public function getOne($id)
    {
        $userData = array("name" => null, "age" => 0);
 
        if (null !== $id && isset($this->userList[$id])) {
            $userData = $this->userList[$id];
        }
 
        return $userData;
    }
 
    public function set(array $userData, $id = null)
    {
        if (null === $id) {
            if (!$id = key(end($this->userList))) {
                $id = 0; 
            }
        }
 
        $this->userList[$id] = $userData;
    }
 
    // ... kode selanjutnya
}

Tambahkan juga isi dari method form() pada class UserController. Berikut contohnya.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// file Controller/UserController.php
 
class UserController
{
    // ... kode sebelumnya
 
    public function form($id = null)
    {
        $userModel = new UserModel();
        $userData = $userModel->getOne($id);
 
        if ($_POST) {
            $userModel->set($userData = $_POST, $id);
            $userModel->save();
        }
 
        require 'View/UserFormView.php';
    }
}
 

Langkah terakhir dalam tahap ini adalah membuat view pada file UserFormView.php. Berikut contohnya.

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- File View/UserFormView.php -->
 
<h1>Form User <?php echo $id ? 'Update' : 'Create' ?></h1>
 
<?php if($_POST): ?>
    <h4>User saved</h4>
<?php endif ?>
 
<form method="post">
    <p>Name: <input type="text" name="name" value="<?php echo $userData['name'] ?>"></p>
    <p>Age: <input type="text" name="age" value="<?php echo $userData['age'] ?>"></p>
    <p>
        <a href="?controller=UserController/index">&laquo; Back to list</a>
        <button type="submit">Save</button>
    </p>
</form>
 

Setelah halaman form dan dibuat, cobalah akses halaman melalui url lokal contoh http://localhost/mvc/index.php?controller=UserController/form untuk menambah data baru. Berikut contoh outputnya.

Contoh form MVC pada PHP

 

Model, View dan Controller telah selesai dibuat dan bisa diuji coba. Berikut ini adalah isi lengkap dari file index.php, Controller/UserController.php, Model/UserModel.php, View/UserListView.php, View/UserFormView.php.

File index.php

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// file index.php
 
require "Controller/UserController.php";
require "Model/UserModel.php";
 
$params = isset($_GET['controller']) ? $_GET['controller'] : null;
if (null === $params) {
    die("Page not found!");
}
 
@list($controller, $method, $id) = explode("/", $params);
if (!class_exists($controller) || (class_exists($controller) && !method_exists($controller, $method))) {
    die("Page not found!");
}
 
call_user_func_array(array(new $controller(), $method), array($id));
 

File Controller/UserController.php

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
// file Controller/UserController.php
 
class UserController
{
    public function index()
    {
        $userModel = new UserModel();
        $userList = $userModel->getAll();
 
        require 'View/UserListView.php';
    }
 
    public function form($id = null)
    {
        $userModel = new UserModel();
        $userData = $userModel->getOne($id);
 
        if ($_POST) {
            $userModel->set($userData = $_POST, $id);
            $userModel->save();
        }
 
        require 'View/UserFormView.php';
    }
}
 

File Model/UserModel.php

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
// file Model/UserModel.php
 
class UserModel
{
    private $userList = array();
 
    public function __construct()
    {
        $storage = isset($_COOKIE['user']) ? $_COOKIE['user'] : null;
 
        if (!$storage || ($storage && empty($this->userList = unserialize($storage)))) {
            $this->userList[1] = array("name" => "Hendry", "age" => 21);
            $this->userList[2] = array("name" => "Diana", "age" => 19);
            $this->save();
        }
    }
 
    public function getAll()
    {
        return $this->userList;
    }
 
    public function getOne($id)
    {
        $userData = array("name" => null, "age" => 0);
 
        if (null !== $id && isset($this->userList[$id])) {
            $userData = $this->userList[$id];
        }
 
        return $userData;
    }
 
    public function set(array $userData, $id = null)
    {
        if (null === $id) {
            if (!$id = key(end($this->userList))) {
                $id = 0; 
            }
        }
 
        $this->userList[$id] = $userData;
    }
 
    public function save()
    {
        setcookie('user', $_COOKIE['user'] = serialize($this->userList));
    }
}
 

File View/UserListView.php

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- file View/UserListView.php -->
<h1>User List</h1>
<a href="?controller=UserController/form">+ Add new</a>
<ol>
    <?php foreach ($userList as $id => $userData): ?>
    <li>
        <a href="?controller=UserController/form/<?php echo $id ?>">
            <?php printf("%s, %s years old", $userData['name'], $userData['age']) ?>
        </a>
    </li>
    <?php endforeach ?>
</ol>
 

File View/UserFormView.php

Language: php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- File View/UserFormView.php -->
 
<h1>Form User <?php echo $id ? 'Update' : 'Create' ?></h1>
 
<?php if($_POST): ?>
    <h4>User saved</h4>
<?php endif ?>
 
<form method="post">
    <p>Name: <input type="text" name="name" value="<?php echo $userData['name'] ?>"></p>
    <p>Age: <input type="text" name="age" value="<?php echo $userData['age'] ?>"></p>
    <p>
        <a href="?controller=UserController/index">&laquo; Back to list</a>
        <button type="submit">Save</button>
    </p>
</form>
 

Nah cukup mudah bukan? Tidak terlalu rumit bahkan bagi pemula. Konsep MVC pada PHP juga sangat cocok untuk kerja team karena susunannya yang terorganisasi. Belum lagi jika proyek yang dikerjakan tergolong proyek besar, tentunya akan sangat rumit apabila kode PHP sudah tumbuh semakin besar jumlah line atau baris kodenya maka dari itulah mulai digunakannya konsep MVC. Sekarang ini MVC pada PHP bisa dikatakan telah menjadi standard dalam pembangunan proyek karena hampir semua framework PHP mengadopsi design pattern MVC.