Files
yii/docs/guide/id/basics.controller.txt
2009-11-01 17:58:27 +00:00

236 lines
8.4 KiB
Plaintext

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.
~~~
[php]
class SiteController extends CController
{
}
~~~
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`.
> Note|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.
>Note|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|CWebApplication::controllerMap]
>serta [peta aksi|CController::actions] keduanya menggunakan kunci dalam huruf kecil.
Sejak versi 1.0.3, sebuah aplikasi bisa berisi [modul](/doc/guide/basics.module). Rute aksi kontroler di dalam sebuah modul yakni dalam format `moduleID/controllerID/actionID`. Untuk lebih rinci, lihat [seksi mengenai modul](/doc/guide/basics.module).
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](/doc/guide/basics.module) 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.
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:
~~~
[php]
class UpdateAction extends CAction
{
public function run()
{
// tempat logika aksi di sini
}
}
~~~
Agar kontroler mengamati aksi ini, kita timpa metode
[actions()|CController::actions] pada kelas kontroler kita:
~~~
[php]
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
------
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:
~~~
[php]
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:
~~~
[php]
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,
~~~
[php]
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.
<div class="revision">$Id: basics.controller.txt 1263 2009-07-21 19:22:00Z qiang.xue $</div>