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
{
}
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
daripadapath/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.
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.
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
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.
Signup or Login in order to comment.