mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-04 15:24:07 +01:00
236 lines
8.4 KiB
Plaintext
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> |