Memulai Pembuatan Aplikasi Web dengan Yii2 (2): Ngubek Controller

Muhammad Arslan 30 Juni 2016

Memulai Pembuatan Aplikasi Web dengan Yii2 (2): Ngubek Controller

Mungkin bagi Anda yang sudah terbiasa dengan menggunakan web framework, pastinya sudah akrab dengan arsitektur MVC. Dimana C dalam MVC adalah controller. Controller adalah sebuah kode yang akan memproses request yang datang dari sebuah URL tertentu. Controller juga bertugas untuk melakukan proses pengambilan data entah itu dari database ataupun resource lainnya kemudian menampilkannya ke dalam sebuah response yang biasanya berupa halaman HTML.

Menurut dokumentasi resmi Yii2, controller merupakan sebuah class yang diturunkan dari yii\base\Controller yang bertugas untuk memproses request dan menghasilkan sebuah response. Response tersebut dapat berupa text/html, application/json, application/pdf, dan lainnya. Yii2 memiliki sejumlah variasi dalam menggunakan controller*. Mari kita lihat satu persatu.

Membuat controller baru

Membuat controller di Yii2 cukup mudah. Anda tinggal membuat sebuah file di folder hello-yii/controllers dengan mengikuti sejumlah aturan yang berlaku agar file tersebut dapat dikenali sebagai controller*. Aturan dasar tersebut adalah sebagai berikut:
  • Sudah pasti ekstensi file harus .php
  • Nama file harus diawali dengan huruf kapital dan diakhiri dengan Controller. Misal: LoremController, MahasiswaController, DosenController, FlightController, HotelController, dan lainnya
  • Bila terdiri dari dua suku kata maka digunakan camel case. Misal: LoremIpsumController, HotelExpediaController, FlightGarudaController, FlightAirAsiaController, FlightBatikAirController, dan lainnya
  • Nama file harus menjadi nama class dari controller yang Anda buat. Bila tidak digunakan akan terjadi error not found
Sekarang coba buat kode berikut ke dalam file dengan nama HelloController.php:
<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

class HelloController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex()
    {
        echo "Hello World";
    }

    public function actionPosts($id=0, $category="all")
    {
        echo "Sedang menampilkan postingan dengan id: ".$id;
    }

    public function actionPostComments($id)
    {
        echo "Sedang menampilkan komentar dari postingan dengan id: ".$id;
    }

    public function actionUserPosts($user_id, $bulan, $tahun)
    {
        echo "Sedang menampilkan daftar postingan dari user dengan id ".$user_id." dengan arsip ".$bulan." / ".$tahun;
    }
}

Source code diatas merupakan struktur umum sebuah controller. Sebuah class controller akan meng-extend sebuah class dari Yii2 yaitu class Controller yang berasal dari modul yii\web. Kemudian di dalam class terdapat berbagai method yang bersifat public yang nantinya akan dapat diakses dari web browser melalui URL tertentu. Pada source code diatas, Anda dapat menemukan sebuah kode yaitu namespace. Keyword namespace adalah sebuah penanda bahwa file tersebut berada di sebuah virtual path yaitu app\controllers. Path app adalah dari aplikasi Yii2 yang Anda tulis, sedangkan controllers adalah path dari folder controllers yang menyimpan file HelloController.php. Kegunaan namespace adalah file tersebut dapat di-import dari class yang berada di dalam namespace* yang sama.

Kemudian ada keyword use, kurang lebih fungsinya sama dengan include() hanya saja ini adalah fitur yang lebih moderdn dibandingkan include. Keyword use dipergunakan untuk menggunakan sebuah class yang sudah terdaftar dalam namsepace. Sekarang mari kita periksa function yang ada di dalam HelloController:

  • actions(), adalah sebuah standalone function yang akan mengeluarkan aksi khusus yang ditangani oleh Yii2. Pada source code diatas, Yii2 akan menampilkan halaman error bila terjadi sebuah kesalahan
  • actionIndex(), akan memproses request dari URL seperti http://hostname/web/index.php?r=hello/ atau http://hostname/web/index.php?r=hello/index
  • actionPosts($id, $category) akan memproses request dari URL seperti http://hostname/web/index.php?r=hello/posts&id=1&category=programming, http://hostname/web/index.php?r=hello/posts, atau http://hostname/web/index.php?r=hello/posts&id=10. actionPosts() memiliki sebuah parameter id dan category yang tidak bersifat wajib karena sudah diberi nilai default jika tidak disertakan kedua parameter tersebut
  • actionPostsComments($id) akan memproses request dari URL seperti http://hostname/web/index.php?r=hello/post-comments&id=10. Action tersebut memiliki sebuah parameter wajib yang bernama id.
  • actionUserPosts($user_id, $bulan, $tahun), akan memproses request dari URL seperti http://hostname/web/index.php?r=hello/users-posts?user_id=10&bulan=5&tahun=2010. Action tersebut memiliki tiga parameter wajib yang harus diisi, bila tidak diisi akan menimbulkan error Bad Request.
Dari penjelasan diatas dapat disimpulkan beberapa hal:
  • parameter r adalah nama aksi yang dituju pada suatu controller dengan segmen pertama adalah nama controller dan segmen kedua adalah nama action (r=controller/action)
  • parameter selain r yang namanya sama dengan parameter yang ada di dalam action di class Controller merupakan parameter yang akan diproses lebih dulu oleh action. Bila diberi nilai default tidak akan menimbulkan error Bad Request. Sedangkan bila tidak diberi nilai default maka harus diisi dan disertakan ketika melakukan request terhadap action tersebut
  • setiap nama method harus diawali dengan kata action agar dikenali saat mengakses URL-nya
  • bila nama action mengandung dua kata seperti actionPostsComments dan actionUserPosts maka akan dipisahkan dengan tanda strip (dash) menjadi post-comments dan user-posts. Tentunya bila Anda menulisnya dalam format camel case.

Membuat folder di dalam controller

Bila suatu saat Anda ingin mengelompokkan file - file controller dalam sebuah folder, Yii2 sudah dapat memfasilitasi hal tersebut. Sekarang mari kita buat folder dengan nama media di dalam folder controllers. Kemudian buatlah file dengan nama AudioController.php di dalam folder controllers/media tersebut.

Sekarang silahkan buat source code berikut di dalam file AudioController.php:

<?php

namespace app\controllers\media;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

class AudioController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex($id=null)
    {
        echo "Sedang menampilkan daftar file audio yang sudah diupload ".$id;
    }

    public function actionCreate()
    {
        echo "Disini akan muncul form tambah audio";
    }
}

Sekarang buat lagi file dengan nama PhotoController.php di dalam folder controllers/media dan buat source code di bawah ini:

<?php

namespace app\controllers\media;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

class PhotoController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex($id=null)
    {
        echo "Sedang menampilkan daftar foto yang sudah diupload ".$id;
    }

    public function actionCreate()
    {
        echo "Disini akan muncul form tambah foto";
    }
}

Sekarang buat lagi file dengan nama VideoController.php di dalam folder controllers/media dan buat source code di bawah ini:

<?php

namespace app\controllers\media;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

class VideoController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex($id=null)
    {
        echo "Sedang menampilkan daftar video yang sudah diupload ".$id;
    }

    public function actionCreate()
    {
        echo "Disini akan muncul form tambah video";
    }
}

Sekarang Anda dapat mengakses ketiga controller tersebut dengan URL seperti berikut:

  • http://hostname/web/index.php?r=media/audio
  • http://hostname/web/index.php?r=media/audio&id=10
  • http://hostname/web/index.php?r=media/audio/create
  • http://hostname/web/index.php?r=media/video
  • http://hostname/web/index.php?r=media/video&id=10
  • http://hostname/web/index.php?r=media/video/create
  • http://hostname/web/index.php?r=media/photo
  • http://hostname/web/index.php?r=media/photo&id=10
  • http://hostname/web/index.php?r=media/photo/create
Menarik bukan? begitulah bagaimana cara Yii2 bekerja dalam menangani request dari sebuah URL. Mari kita lanjutkan ke bagian yang lain.
Screenshot from 2016-06-29 09:48:18

Menentukan default route

Di dalam folder config terdapat beberapa file konfigurasi untuk params, db, console, dan web. Anda dapat menambahkan default route agar ketika membuka URL utama (root) dapat menampilkan controller yang Anda tentukan.

Silahkan tambahkan konfigurasi berikut ke dalam array $config tepat dibawah konfigurasi dengan key id:

$config = [
    'id' => 'basic',
    'defaultRoute' => 'hello',
    ....
    ];

Maka hasilnya akan seperti pada gambar berikut ini:

Screenshot from 2016-06-29 09:48:44

Menggunakan redirect()

Anda pun dapat menggunakan method redirect() yang sudah built-in dari class Controller. Method tersebut digunakan untuk mengalihkan halaman dari halaman Anda saat ini ke halaman lain yang ditentukan:

namespace app\controllers;

use Yii; use yii\filters\AccessControl; use yii\web\Controller;

class HelloController extends Controller {

...........................................................


public function actionTestRedirect()
{
    echo "Halaman ini akan diredirect ini dalam 5 detik...";
    sleep(5);
    return $this->redirect('/hello-yii/web/index.php');
}

}

Menyusun controller map

Anda juga dapat menambahkan controller map yaitu mengarahkan controller ke URL yang Anda tentukan sendiri. Anda dapat menambahkan controller map di dalam $config di file config/web.php. Agar tidak bingung penempatannya, silahkan tambahkan controllerMap di setelah id:
$config = [
    'id' => 'basic',
    'controllerMap' => [
        // declares "account" controller using a class name
        'demo' => 'app\controllers\HelloController',
    ],
...

];

Maka hasilnya akan seperti pada gambar berikut ini:

Screenshot from 2016-06-29 09:50:32

Mengaktifkan pretty url

Anda juga dapat mengaktifkan pretty url agar URL diubah menjadi bentuk segmen dibandingkan query string. Anda dapat menambahkan urlManager di dalam parameter components di $config yang berada di file config/web.php. Agar tidak bingung silahkan tambahkan urlManager di bagian paling awal parameter components:
$config = [
    'id' => 'basic',
...

'components => [
    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => true,
        'enableStrictParsing' => false,
        'rules' => [],
    ],

    ...

],

];

Maka hasilnya akan seperti pada gambar berikut ini:

Screenshot from 2016-06-29 09:51:06

Penutup

Sekarang Anda sudah mengenal beberapa teknik dalam menggunakan controller di Yii2. Anda pun dapat mengatur URL untuk menjadi pretty url atau versi konvensional. Selain itu Anda pun dapat memetakan sebuah controller ke dalam URL yang Anda definisikan sendiri melalui controller map. Secara umum, Yii2 sudah mampu mengakomodasi kebutuhan Anda untuk mendefinisikan controller dengan berbagai kondisi.

(rfs/yiiframework)