0 follower

Kontroler

Sebuah kontroler (pengontrol) adalah turunan CController atau anak kelasnya. Ia dibuat oleh aplikasi saat pengguna memintanya. Ketika kontroler berjalan, ia melakukan aksi yang diminta yang biasanya memerlukan model dan membuat tampilan yang sesuai. Sebuah aksi, dalam bentuk paling sederhana adalah hanyalah metode kelas kontroler yang namanya dimulai dengan action.

Kontroler memiliki aksi standar. Ketika perminttan pengguna tidak menetapkan aksi mana yang dijalankan, aksi standar yang akan dijalankan. Biasanya aksi standar dinamai sebagai index. Ia bisa diubah dengan menyetel CController::defaultAction.

Di bawah ini adalah kode minimal yang diperlukan oleh kelas kontroler. Karena kontroler tidak mendefinisikan aksi apapun, memintanya akan memunculkan eksepsi.

class SiteController extends CController
{
}

1. Rute

Kontroler dan aksi diidentifikasi dengan ID. Di mana ID Kontroler dalam format path/ke/xyz yang merujuk ke file kelas kontroler protected/controllers/path/ke/XyzController.php, di mana token xyz harus diganti dengan nama sebenarnya (contoh, post merujuk ke protected/controllers/PostController.php). ID Aksi adalah nama metode aksi tanpa prefiks action. Sebagai contoh, jika kelas kontroler berisi sebuah metode bernama actionEdit, ID dari aksi terkait adalah edit.

Catatan: Sebelum versi 1.0.3, format ID kontroler adalah path.ke.xyz daripada path/ke/xyz.

Permintaan para pengguna terhadap kontroler dan aksi tertentu dalam batasan rute. Rute dibentuk dengan menggabungkan ID kontroler dan ID aksi yang dipisahkan dengan garis miring. Sebagai contoh, rute post/edit merujuk ke PostController dan aksi edit. Dan secara standar, URL http://hostname/index.php?r=post/edit akan meminta kontroler dan aksi ini.

Catatan: Standarnya, rute sensitif jenis huruf. Sejak versi 1.0.1, dimungkinkan menjadikan rute tidak sensitif huruf dengan menyetel CUrlManager::caseSensitive menjadi false dalam konfigurasi aplikasi. Ketika dalam mode tidak sensitif huruf, pastikan Anda mengikuti konvensi bahwa direktori yang berisi file kelas kontroler dalam huruf kecil, dan peta kontroler serta peta aksi keduanya menggunakan kunci dalam huruf kecil.

Sejak versi 1.0.3, sebuah aplikasi bisa berisi modul. Rute aksi kontroler di dalam sebuah modul yakni dalam format moduleID/controllerID/actionID. Untuk lebih rinci, lihat seksi mengenai modul.

2. Penurunan Kontroler

Turunan kontroler dibuat ketika CWebApplication menangani permintaan yang masuk. Berdasarkan ID kontroler yang diberikan, aplikasi akan menggunakan aturan berikut untuk menentukan kelas kontroler apa dan di mana file kelas ditempatkan.

  • Jika CWebApplication::catchAllRequest ditetapkan, kontroler akan dibuat berdasarkan properti ini, dam ID kontroler yang ditetapkan pengguna akan diabaikan. Ini dipakai terutama untuk menyimpan aplikasi dalam mode pemeliharaan dan menampilkan halaman statis pemberitahuan.

  • Jika ID ditemukan dalam CWebApplication::controllerMap, konfigurasi kontroler terkait akan dipakai dalam membuat turunan kontroler.

  • Jika ID ada dalam format 'path/ke/xyz', nama kelas kontroler diasumsikan adalah XyzController dan file kelas terkait adalah protected/controllers/path/ke/XyzController.php. Sebagai contoh, ID kontroler admin/user akan dipecahkan sebagai kelas kontroler UserController dan file kelas protected/controllers/admin/UserController.php. Jika file kelas tidak ada, 404 CHttpException akan dimunculkan.

Dalam hal ketika modul dipakai (tersedia sejak versi 1.0.3), proses di atas cukup berbeda. Dalam keadaan tertentu, aplikasi akan memeriksa apakah ID merujuk ke kontroler di dalam sebuah modul, dan jika demikian, turunan modul akan dibuat lebih dulu diikuti dengan turunan kontroler.

3. Aksi

Seperti telah disebutkan, aksi dapat didefiniskan sebagi metode yang namanya dimulai dengan kata action. Cara lebih tinggi adalah dengan mendefinisikan kelas aksi dan meminta kontroler untuk menurunkannya bila diminta. Ini mengijinkan aksi untuk dipakai ulang dan selanjutnya menjadikan lebih bisa dipakai ulang.

Untuk mendefinisikan kelas aksi baru, lakukan hal berikut:

class UpdateAction extends CAction
{
    public function run()
    {
        // tempat logika aksi di sini
    }
}

Agar kontroler mengamati aksi ini, kita timpa metode actions() pada kelas kontroler kita:

class PostController extends CController
{
    public function actions()
    {
        return array(
            'edit'=>'application.controllers.post.UpdateAction',
        );
    }
}

Di atas, kita menggunakan alias path application.controllers.post.UpdateAction untuk menetapkan apakah file kelas aksi adalah protected/controllers/post/UpdateAction.php.

Dengan menulis aksi berbais-kelas, kita dapat mengatur aplikasi dalam gaya moduler. Sebagai contoh, struktur direktori berikut dapat dipakai untuk mengatur kode kontroler:

protected/
    controllers/
        PostController.php
        UserController.php
        post/
            CreateAction.php
            ReadAction.php
            UpdateAction.php
        user/
            CreateAction.php
            ListAction.php
            ProfileAction.php
            UpdateAction.php

4. Filter

Filter adalah kode yang dikonfigurasi untuk dijalankan sebelum dan/atau setelah aksi kontroler dijalankan. Sebagai contoh, filter kontrol akses dapat dijalankan guna memastikan bahwa pengguna diotentikasi sebelum menjalankan aksi yang diminta; filter performansi bisa dipakai untuk mengukur waktu yang diperlukan dalam menjalankan aksi.

Aksi bisa memiliki multipel filter. Filter dijalankan dalam urutan seperti yang terlihat dalam daftar filter. Filter bisa menjaga eksekusi aksi dan filter lain yang tidak dieksekusithe action and the rest of the unexecuted filters.

Filter bisa didefinisikan sebagai metode kelas kontroler. Nama metode harus dimulai dengan filter. Sebagai contoh, keberadaan metode filterAccessControl mendefinisikan sebuah filter bernama accessControl. Metode filter harus bertanda:

public function filterAccessControl($filterChain)
{
    // panggil $filterChain->run() untuk melanjutkan penyaringan dan eksekusi aksi
}

di mana $filterChain adalah turunan CFilterChain yang menggambarkan daftar filter yang dikaitkan dengan aksi yang diminta. Di dalam metode filter, kita dapat memanggil $filterChain->run() untuk melanjutkan penyaringan dan jalannya aksi.

Filter juga dapat berupa turunan CFilter atau anak kelasnya. Kode berikut mendefinisikan kelas filter baru:

class PerformanceFilter extends CFilter
{
    protected function preFilter($filterChain)
    {
        // logika sedang diterapkan sebelum aksi dieksekusi
        return true; // false jika aksi tidak dieksekusi
    }
 
    protected function postFilter($filterChain)
    {
        // logika sedang diterapkan setelah aksi dieksekusi
    }
}

Untuk menerapkan filter terhadap aksi, kita perlu menimpa metode CController::filters(). Metode harus mengembalikan array konfigurasi filter. Contoh,

class PostController extends CController
{
    ......
    public function filters()
    {
        return array(
            'postOnly + edit, create',
            array(
                'application.filters.PerformanceFilter - edit, create',
                'unit'=>'second',
            ),
        );
    }
}

Kode di atas menetapkan dua filter: postOnly dan PerformanceFilter. Filter postOnly berbasis-metode (metode filter terkait sudah didefinisikan dalam CController); sementara filter PerformanceFilter berbasis obyek. Alias path application.filters.PerformanceFilter menetapkan bahwa file kelas filter adalah protected/filters/PerformanceFilter. Kita menggunakan array untuk mengkonfigurasi PerformanceFilter agar ia dapat dipakai guna menginisialisasi nilai properti obyek filter. Di sini, properti unit pada PerformanceFilter akan diinisialisasi sebagai 'second'.

Dengan menggunakan operator plus dan minus, kita dapat menetapakan aksi mana yang harus dan tidak diterapkan oleh filter. Dalam contoh di atas, postOnly harus diterapkan ke aksi edit dan create, sementara PerformanceFilter harus diterapkan ke semua aksi KECUALI edit dan create. Jika plus maupun minus tidak muncul dalam konfigurasi filter, maka filter akan diterapkan ke semua aksi.