Controller

Seperti yang telah dibahas pada bagian Apa itu MVC?, peran utama dari Controller adalah menghubungkan antara view dengan model. Pada bagian ini kita akan membangun fondasi dari Controller: sebuah kelas abstrak yang nantinya akan diwariskan oleh pengguna framework ketika mereka ingin membuat Controller. Setiap Controller harus mewariskan sifat dari kelas abstrak Controller yang akan kita kembangkan ini, untuk memastikan seluruh Controller yang ada dapat memanggil view dengan benar. Kelas abstrak ini memiliki dua fungsi utama: menjalankan action yang sesuai dengan permitaan pengguna, dan memanggil view yang relevan dengan action tersebut.

Fondasi Controller: BaseController.php

Agar tidak terlalu mengambang dan bingung dengan penjelasan yang diberikan, mari kita lihat langsung bagaimana kode yang dimaksud di atas. Buat sebuah file dengan nama BaseController.php pada direktori lib/MVC/Controller. Isikan kode di bawah ke dalam file BaseController.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
<?php

namespace lib\MVC\Controller;

abstract class BaseController {
    protected $urlParams;
    protected $action;

    public function __construct($action, $urlParams) {
        $this->action = $action;
        $this->urlParams = $urlParams;
    }

    public function ExecuteAction() {
        return $this->{$this->action}();
    }

    protected function RenderView($viewModel, $fullView = true) {
        $classData = explode("\\", get_class($this));
        $className = end($classData);

        $content = __DIR__ .
               "/../../../views/" .
               $className . "/" .
               $this->action . ".php";

        if ($fullView) {
            require __DIR__ . "/../../../views/template.php";
        } else {
            require $content;
        }
    }
}

Apa yang baru saja kita kerjakan? Pastinya kita telah membuat sebuah kelas abstrak BaseController, yang memiliki dua buah data: $urlParams dan $action. Sesuai dengan namanya, $urlParams menyimpan seluruh data GET yang diberikan oleh server, sementara $action menyimpan nama action yang akan dijalankan oleh pengguna.

Variabel $viewModel merupakan variabel yang menampung data yang akan kita dapatkan melalui bagian Model nanti, sementara variabel $fullView digunakan untuk menentukan apakah View akan ditampilkan dengan lengkap (beserta dengan tag <html><head> ...) atau tidak.

Method ExecuteAction() berfungsi untuk memanggil method action yang dibuat oleh Controller yang mengimplementasikan kelas abstrak ini. Secara otomatis, nama method untuk action yang akan dipanggil harus sama dengan nama action itu sendiri. Hal ini berarti URL http://web.com/home/about akan memanggil method about() pada Controller Home.

Method RenderView() bertanggung jawab untuk memanggil View yang tepat, dan memberikan data Model yang didapatkan ke View tersebut. Dua baris awal dari kode dalam method ini:

1
2
3
4
5
// contoh isi $classData: array("lib", "MVC", "Controller", "BaseController")
$classData = explode("\\", get_class($this));

// isi $className: "BaseController"
$className = end($classData);

Berguna untuk mengambil nama Controller akan ditampilkan View-nya. Baris pertama mengambil nama Controller melalui fungsi get_class(). Karena nilai kembalikan dari fungsi get_class() memberikan nama kelas beserta dengan namespace-nya, maka kita harus mengolahnya terlebih dahulu untuk mendapatkan hanya nama kelas saja. Fungsi explode() digunakan untuk memecah namespace dan nama kelas tersebut ke dalam array, dan fungsi end() digunakan untuk mengambil elemen terakhir dari array yang didapatkan pada baris pertama. Nama kelas selalu muncul pada akhir namespace, sehingga kita dapat yakin fungsi end() akan memberikan nama kelas yang benar.

Setelah mendapatkan nama Controller yang relevan, kita kemudian mencoba mengakses direktori view pada direktori utama kode (tempat file Autoloader.php dan index.php berada). Setiap View harus disimpan dalam direktori view tersebut, dan di dalam direktori view terdapat direktori untuk View dari masing-masing Controller. Nama file untuk masing-masing View dirancang untuk harus sama dengan nama action, agar terdapat keseragaman dan kemudahan perawatan kode.

Kita akan melengkapi seluruh bagian View pada bagian selanjutnya, sehingga sekarang tidak perlu terlalu khawatir jika belum terlalu mengerti method RenderView(). Bagian selanjutnya akan menjelaskan hal-hal yang masih “kosong” pada bagian ini. Untuk sekarang, kita akan coba mebuat sebuah Controller standar terlebih dahulu, yaitu Controller Home.

Controller Pertama: Home.php

Langkah untuk pembuatan Controller baru sangat mudah: buat kelas sesuai dengan nama Controller yang diinginkan pada direktori controllers. Direktori controllers harus berada di dalam direktori utama kode. Jadi, langkah pertamanya adalah membuat direktori controllers, yang berisikan satu file saja, yaitu Home.php. Isi dari Home.php adalah sebagai berikut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php

namespace controllers;

use lib\MVC\Controller\BaseController;

class Home extends BaseController {
    protected function Index() {
        $viewModel = "DATA";
        $this->RenderView($viewModel);
    }
}

Simpel kan? Kunci dari membuat sebuah Controller ada dua, yaitu:

  1. Lakukan implementasi terhadap BaseController
  2. Nama method yang dibuat di dalam Controller akan menjadi nama rute URL secara otomatis.

Sesuai dengan poin kedua, method Index() pada Controller “Home” dapat diakses dengan mengakses /home/index/ atau hanya dengan mengakses / saja. Misalnya, jika seluruh kode anda disimpan pada direktori framework, maka anda dapat mengakses halmana http://localhost/framework/ atau http://localhost/framework/home/index.

Terakhir, kita juga perlu menambahkan kode pada file index.php, yang menjalaknak ExecuteAction. Ganti isi index.php menjadi seperti berikut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    <?php

    require_once __DIR__ . "/AutoLoader.php";

    use lib\MVC\Router;
    use lib\MVC\Controller;

    $kernel = new Router($_GET);
    $controller = $kernel->getController();
    $controller->ExecuteAction();

Sampai titik ini, jika mengakses halaman utama kita akan mendapatkan pesan kesalahan:

Pesan Kesalahan Selesai Membuat Controller

Pesan Kesalahan Selesai Membuat Controller

Sesuai dengan keterangannya, aplikasi yang dibangun mencoba mengakses View, yang tidak dapat ditemukan. Kenapa View tidak dapat ditemukan? Karena kita belum membuat View! Mari kita kembangkan View sekarang!

Note

Seluruh kode program sampai di titik ini dapat dilihat di repository Github kode.

Bagikan Tulisan
comments powered by Disqus
Kembali ke bertzzie.com