Include File Otomatis dan index.php

Salah satu fitur framework yang paling memudahkan kita adalah fitur yang memungkinkan kita untuk memanggil class dan fungsi-fungsi yang dibuat secara otomatis, tanpa harus menggunakan fungsi include atau require. Fitur ini dikenal dengan nama “Autoloading”, yang dapat kita kembangkan dengan menggunakan fungsi dasar PHP: spl_autoload_register. Mari kita mulai pengembangan framework kita dengan memberikan fitur autoloading ini terlebih dahulu.

Include File Otomatis

Langsung saja, buat sebuah file dengan nama Autoloader.php di dalam direktori utama kode, yang berisikan dua baris kode berikut:

1
2
3
4
<?php

spl_autoload_extensions(".php");
spl_autoload_register();

Apa yang baru saja kita lakukan? Fungsi spl_autoload_extensions merupakan fungsi yang memberitahukan PHP untuk memberikan semua file dengan ekstensi yang kita berikan (“.php”) untuk dibaca oleh fungsi lain, yaitu __autoload(). Fungsi __autoload sendiri merupakan fungsi yang dipanggil secara otomatis oleh PHP ketika fitur autoloading diaktifkan. Lalu bagaimana cara aktivasi fitur autoloading? Dengan memanggil fungsi spl_autoload atau spl_autoload_register.

Kita memanggil fungsi spl_autoload_register tanpa memberikan parameter apapun, yang artinya PHP akan menggunakan aturan standar, yaitu tempat penyimpanan file kelas akan sama dengan nama direktori yang kita gunakan untuk namespace dari kelas tersebut. Hal ini berarti jika kita memiliki kelas dengan kode seperti ini:

1
2
3
4
5
6
7
<?php

namespace lib\MVC; // Direktori harus sama!

class Loader {
    // ...
}

Maka kita harus menyimpan file kelas tersebut pada direktori lib/MVC, relatif terhadap kode yang kita gunakan. Jika menggunakan aturan dengan tepat, ketika memanggil kelas tersebut ktia tidak lagi perlu memanggil fungsi include atau require. Mudah bukan?

Router

Selain fitur pemanggilan kelas secara otomatis, biasanya sebuah framework PHP juga memberikan kemudahan dalam hal memperindah URL. Struktur URL secara standar akan diberikan oleh framework, misalnya dalam format http://web.com/controller/action/id. Fitur ini dikenal dengan nama URL Rewriting, yang dapat diimplementasikan dengan kombinasi antara pengaturan web server dan kode PHP. Kita akan mengembangkan fitur yang sama sekarang, sebelum mulai membuat file index.php.

URL Rewriting pada Server

Sebelum mulai, kita harus membuat satu asumsi terlebih dahulu: yaitu web server yang digunakan adalah Apache HTTPD. Apache merupakan salah satu web server yang paling populer, dan biasanya digunakan oleh operator shared hosting, sehingga kita dapat berasumsi secara umum bahwa konfigurasi kita dapat digunakan. Jika tempat hosting anda tidak mengaktifkan fitur ini, silahkan hubungi tempat hosting anda untuk aktivasi fitur. Untuk server lokal, ikuti tutorial berikut untuk aktivasi fitur URL Rewriting Apache.

Setelah aktivasi fitur URL Rewriting, kita harus membuat sebuah file bernama .htaccess (tanda titik di awal file sangat penting). Letakkan file ini pada direktori utama kode (sama dengan Autoloader.php), dan isikan file dengan kode berikut:

1
2
3
4
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ \
        index.php?controller=$1&action=$2&id=$3 [NC,L]

Apa yang baru saja kita lakukan? Dua baris pertama kode di atas merupakan perintah untuk aktivasi fitur URL Rewrite pada direktori kode program kita, sehingga setiap kali menerima URL pada direktori tersebut Apache akan mengubahnya sesuai dengan aturan yang telah kita tentukan. Seperti yang telah dapat ditebak, aturan perubahan URL terdapat pada baris ketiga. Aturan dituliskan dengan Regular Expression (Regex), dengan format RewriteRule <URL Asli (Regex)> <URL Hasil Konversi>.

Aturan yang kita tetapkan sangat sederhana: setiap URL dengan format http://web.com/kode1/kode2/kode3 akan diubah menjadi http://web.com/index.php?controller=kode1&action=kode2&id=kode3. Kode2 dan Kode3 bersifat opsional, yang berarti boleh diisikan boleh tidak. (Akan perlu penjelasan mengenai Regex panjang lebar untuk detil dari kenapa aturannya dibaca seperti ini. Pembahasan akan dilakukan lain waktu).

URL Rewriting pada PHP

Selesai konfigurasi server, pastinya kita harus mempersiapkan kode PHP yang dapat membaca hasil konversi URL tersebut. Mari kita mulai dengan membuat file yang menangani hal ini, yaitu Router.php. Simpan file Router.php di dalam direktori lib/MVC untuk memastikan kode kita tersimpan dengan rapi. Berikut adalah isi dari file Router.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
<?php

namespace lib\MVC;

class Router {
    private $controller;
    private $action;
    private $urlParams;

    private $Controller_Namespace = "\\controllers\\";
    private $Base_Controller_Name = "lib\\MVC\\Controller\\BaseController";

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

        if (empty($this->urlParams["controller"])) {
            $this->controller = $this->Controller_Namespace . "Home";
        } else {
            $this->controller = $this->Controller_Namespace .
                            $this->urlParams["controller"];
        }

        if (empty($this->urlParams["action"])) {
            $this->action = "index";
        } else {
            $this->action = $this->urlParams["action"];
        }
    }

    public function getController() {
        if (class_exists($this->controller)) {
            $parent = class_parents($this->controller);

            if (in_array($this->Base_Controller_Name, $parent)) {
                if (method_exists($this->controller, $this->action)) {
                    return new $this->controller($this->action,
                                             $this->urlParams);
                } else {
                    throw new \Exception("Action not found!");
                }
            } else {
                throw new \Exception("Wrong class for controller.
                                  Not derived from BaseController.");
            }
        } else {
            throw new \Exception("Controller not found!");
        }
    }
}

Apa yang baru saja kita buat? Kelas Router bertanggung jawab untuk menemukan Controller yang tepat, beserta memanggil fungsi (action) yang tepat dari Controller tersebut. Kita akan mengirimkan parameter GET ketika pertama kali membuat kelas ini, seperti berikut:

1
$route = new Router($_GET)

Sehingga Router dapat memproses data GET tersebut dan memilih Controller yang tepat. Kode untuk memilih Controller yang tepat sendiri sangat sederhana, hanya memanggil sesuai dengan parameter yang dikirimkan oleh pengguna. Kode untuk pemlihan Controller dan Action cukup gamblang, silahkan dibaca pada fungsi __construct().

Setelah memilih Controller dengan benar, tentunya kita pasti ingin mengambil Controller tersebut, agar proses pengolahan halaman dapat berjalan dengan benar. Fitur pengambilan Controller ini diimplementasikan oleh fungsi getController(), yang juga cukup sederhana isinya: cek apakah Controller merupakan turunan dari BaseController (detil ada pada bagian selanjutnya), lalu cek apakah kelas dan method controller dapat ditemukan atau tidak. Kalau dapat ditemukan, panggil, kalau tidak lemparkan Exception.

Index.php

Sekarang kita telah menyelesaikan semua kode-kode awal yang dibutuhkan untuk menjalankan framework kita, walaupun belum dapat menampilkan apa-apa. Mari kita buat halaman awal framework, yang fungsinya adalah untuk memanggil dan mempersiapkan semua kode yang kita tuliskan sampai sejauh ini.

Buat file index.php pada direktori utama kode anda, yaitu direktori yang sama dengan tempat .htaccess dan Autoloader.php disimpan. Isi dari index.php hanyalah pemanggilan terhadap Autoloader.php dan kelas Router:

1
2
3
4
5
6
7
8
<?php

require_once __DIR__ . "/AutoLoader.php";

use lib\MVC\Router;

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

Sampai titik ini, jika menjalankan kode kita, kita akan mendapatkan pesan kesalahan seperti ini:

Pesan Kesalahan Awal

Pesan Kesalahan Awal

Apa arti kesalahan ini? Inti kesalahan ada di pesan Class controllersHome could not be loaded, yang artinya PHP gagal menemukan kelas controllers\Home, yang artinya kode kita bekerja dengan benar sampai titik ini! Hurrah! Tahap selanjutnya, mari segera fokus untuk membuat Controller!

Note

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

Bagikan Tulisan
comments powered by Disqus
Kembali ke bertzzie.com