Belajar Kode Program

Blog belajar menulis kode program dan aplikasi komputer

Sabtu, 18 Februari 2017

Memahami MVC pada Struktur Aplikasi Yii2

Konsep dengan pola arsitektur Model-View-Controller (MVC) merupakan salah satu terobosan dalam dunia pengembangan aplikasi. Konsep ini pula yang kemudian menjadi tren pengembangan aplikasi menggunakan PHP. Termasuk berbagai framework PHP yang popularitasnya kian hari kian menanjak, seperti Yii Framework. Ulasan artikel berikut ini ingin mengajak memahami konsep yang diterapkan pada framework Yii secara sederhana. Kesederhanaan itu dapat dengan mudah dilihat dari struktur berkas pada framework tersebut.


Inti dari konsep MVC pada Yii Framework dapat dilihat pada gambar di atas. Yang pertama dihadapi pengunjung web dinamakan dengan entry script. Entry script terdapat pada file web/index.php. Dari entri script ini masuklah ke aplikasi Yii yang utamanya adalah kombinasi Controller, View, dan Model.

Perhatikan gambar di atas, hubungan entry script dengan application berkode 1..1 berarti bahwa hanya ada satu entry script (web/index.php) untuk satu aplikasi berbasis Yii. Kemudian hubungan application dengan controller berkode 1..* berarti bahwa setiap satu aplikasi minimal menggunakan satu buah controller. Controller default pada saat instal adalah SiteController. Application memiliki hubungan berkode 0..* dengan module dan komponen. Ini berarti bahwa satu aplikasi boleh tidak menggunakan module dan atau tidak menggunakan komponen. Kalaupun memakai, bisa saja banyak module dan atau banyak komponen.

Selanjutnya di sisi controller juga memiliki hubungan dengan view, model, serta filter. Kode hubungannya sama, yaitu 0..* yang berarti bahwa controller bisa tetap bekerja tanpa melibatkan view, model, ataupun filter sama sekali. Kalaupun melibatkan, jumlahnya bisa lebih dari satu.

Pada bagian view ternyata memiliki hubungan dengan model. Ini berarti bahwa dari view bisa langsung memanggil model. Di view ini pulalah kita dapat memainkan widget serta bundel asset. Penjelasan selanjutkan akan kita lihat dengan fokus pada konsep MVC, yaitu yang terlibat langsung dengan ControllerModel, dan View.

Controller

Controller terletak di folder controllers. Nama dari sebuah controller harus menggunakan awalan huruf kapital dan akhiran Controller, seperti SiteController, PostController, dan sebagainya. Kelas controller mengeksten dari kelas yii\web\Controller. Berikut sintaks dasar sebuah controller:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public function actionIndex()
    {
        return $this->render('index');
    }
}

Di dalam kelas controller terdapat fungsi-fungsi action yang nantinya dipakai sebagai rute aplikasi. Ingat, rute aplikasi pada controller didefinisikan dengan rumus ControllerID/ActionID. Pada contoh sintaks di atas, controller ID-nya adalah site (huruf kecil semua), sedangkan action ID-nya adalah index. Jadi, untuk memanggil fungsi tersebut dapat digunakan rute index.php?r=site/index atau index.php?r=site (karena index adalah action default jika action ID tidak disebutkan).

Jika ada controller yang menggunakan dua kata yang dijadikan satu, seperti PostCommentController, bagaimana controller ID-nya? Gunakan tanda hypen (-) untuk memisahkannya. Jadi, controller PostComment memiliki controller ID post-comment (huruf kecil semua). Demikian pula jika sebuah action terdiri atas dua huruf, misalnya actionLihatData, maka action ID-nya adalah lihat-data (huruf kecil semua).

Pada praktiknya, action bisa memiliki parameter. Bagaimana contohnya dan bagaimana pula rutenya? Perhatikan contoh berikut ini:

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
    public function actionView($id, $version = null)
    {
        // ...
    }
}

Pada contoh di atas, terdapat sebuah fungsi dengan nama actionView. Berarti action ID-nya adalah view. Ada beberapa kemungkinan kita membuat rute. Berikut adalah kemungkinan-kemungkinan tersebut beserta respon dari sistemnya.


  1. index.php?r=post/view&id=123: parameter $id berisi '123', dan $version tetap null.
  2. index.php?r=post/view&id=123&version=2: parameter $id dan $version masing-masing berisi '123' dan  '2'.
  3. index.php?r=post/view: akan menghasilkan respon error (eksepsi) yii\web\BadRequestHttpException karena harus ada parameter $id.
  4. index.php?r=post/view&id[]=123: menghasilkan error yii\web\BadRequestHttpException karena format parameter $id bernilai array ['123'].


Untuk kasus keempat di atas, kita dapat mensiasatinya dengan melakukan type hinting atau mendefinisikan tipe data parameter seperti contoh berikut:

public function actionView(array $id, $version = null)
{
    // ...
}

Action default pada sebuah controller adalah actionIndex. Namun, adakalanya kita ingin mengubahnya dengan action yang lain. Kita dapat melakukannya dengan menambahkan sebaris kode untuk sebuah properti pada kelas controler tersebut. Properti itu adalah defaultAction.

public $defaultAction = 'home'; //mengacu pada actionHome()

Lalu, bagaimana caranya controller berhubungan dengan model dan view? Mari perhatikan potongan kode program berikut ini.

class PostController extends Controller
{
    public function actionView($id)
    {
        $model = Post::findOne($id); //jangan lupa use app\models\Post;
        if ($model === null) {
            throw new NotFoundHttpException; //jangan lupa use yii\web\NotFoundHttpException;
        }

        return $this->render('tampil', [
            'postingan' => $model,
        ]);
    }
}

Pada bagian $model = Post::findOne($id) controller sedang mengakses sebuah model yang berada pada lokasi app\models\Post.php.

Pada bagian return $this->render() controller sedang mengakses view bernama tampil (parameter pertama fungsi render, file ada di views\post\tampil.php) dengan mengirimkan data pada berupa variabel postingan yang isinya adalah variabel $model (parameter kedua). Di view nantinya, kita dapat memainkan sebuah data dengan variabel yang bernama $postingan.

Model

Model adalah bagian dari arsitektur MVC yang merupakan representasi dari data serta rule atau aturan main. Jadi, terkait aturan main atau yang biasa kita sebut dengan validasi data, letaknya di bagian model ini. Sebuah field hanya bisa diisi numerik dengan interval tertentu didefinisikan di model.

Ada beberapa jenis model yang akan sering kita hadapi, tergantung dengan kelas yang dieksten oleh sebuah model. Jenis pertama adalah yang mengeksten dari kelas yii\base\Model. Jenis ini berisi atribut-atribut yang harus didefinisikan sendiri. Adapun jenis kedua adalah yang mengeksten dari kelas yii\db\ActiveRecord. Jenis ini merupakan representasi dari sebuah tabel pada database yang secara otomatis atributnya adalah sama dengan field-field atau kolom-kolom pada tabel tersebut.

Contoh model dengan eksten yii\base\Model

namespace app\models;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $body;
}

Contoh model dengan eksten yii\db\ActiveRecord

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    //
}

Beberapa fungsi yang ada pada kelas Model ini adalah:

  • rules(), untuk melakukan setting validasi atribut data
  • validate(), untuk melakukan proses validasi
  • scenarios(), untuk mendefinisikan skenario apa saja yang bisa diterapkan di model


View

View ini bagian yang bertugas untuk menyajikan data kepada pengguna. Berbeda dengan controller dan model, view ini adalah kode PHP biasa yang bukan merupakan sebuah kelas. Ada dua hal penting yang perlu dibahas dalam konteks view ini. Pertama, peletakan file view dan kedua bagaimana bekerja dengan view ini.

Peletakan file view secara mudah dapat dijelaskan pada tabel berikut ini:


Nama Controller
Lokasi View
Keterangan
PostControllerviews/post-
PostCommentControllerviews/post-comment-



Untuk bekerja dengan view ini, dari controller maupun dari view itu sendiri bisa melakukan pemanggilan fungsi-fungsi berikut:
  • render(): merender view tertentu dan menerapkan suatu layout untuk hasil rendering tersebut.
  • renderPartial(): merender sebuah view tanpa menerapkan layout.
  • renderAjax(): merender sebuah view tanpa layout, tetapi tetap menyertakan skrip javascript atau CSS yang disertakan. Fungsi ini biasa dipakai untuk merespon rekues AJAX.
  • renderFile(): merender sebuah view yang dirinci dengan file path atau suatu alias.
  • renderContent(): merender suatu string atau teks ke layout tertentu.

1 komentar:

  1. Terimakasih, ilmu nya ditulis dengan bahasa yang mudah dipahami.

    BalasHapus