Pages

Wednesday, October 21, 2009

Model

Model adalah turunan dari CModel atau anak kelasnya. Model dipakai untuk memelihara data dan aturan bisnis relevannya.

Model mewakili satu obyek data. Ia dapat berupa baris dalam tabel database atau formulir input bagi pengguna. Setiap field obyek data digambarkan sebagai atribut model. Atribut memiliki label dan bisa divalidasi terhadap set aturan.

Yii mengimplementasi dua jenis model: model formulir dan rekaman aktif. Keduanya diperluas dari kelas basis yang sama CModel.

Model formulir adalah turunan dari CFormModel. Model formulir dipakai untuk memelihara data yang dikumpilkan dari input pengguna. Data tersebut sering dikumpulkan, dipakai kemudian diabaikan. Sebagai contoh, pada halaman masuk, kita dapat menggunakan model formulir untuk menyajikan informasi nama pengguna dan kata sandi yang disediakan oleh pengguna akhir. Untuk lebih jelasnya, silahkan merujuk ke Bekerja dengan Formulir

Active Record (AR) atau rekaman aktif adalah pola design yang dipakai untuk mengaburkan akses database dalam mode terorientasi-obyek. Setiap obyek AR adalah turunan dari CActiveRecord atau kelas anaknya, mewakili satu baris dalam tabel database. Field dalam baris diwakili sebagai properti obyek AR. Rincian mengenai AR dapat ditemukan dalam Rekaman Aktif.

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
{
}

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.

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.

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

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.

Aplikasi

Aplikasi menggambarkan konteks dijalankannya pemrosesan sebuah permintaan. Tugas utamanya adalah memecahkan permintaan pengguna dan meneruskannya ke pengontrol terkait guna pemrosesan selanjutnya. Ia juga bertindak sebagai tempat pusat untuk memelihara konfigurasi tingkat-aplikasi. Oleh karena itu, aplikasi juga disebut pengontrol-depan.

Aplikasi dibuat sebagai kerangka tunggal oleh naskah entri. Kerangka aplikasi dapat diakses di mana saja melalui Yii::app().

Konfigurasi Aplikasi

Standarnya, aplikasi adalah turunan dari CWebApplication. Untuk mengkustomisasinya, kami sediakan file konfigurasi (atau array) guna mengawali nilai propertinya saat turunan aplikasi dibuat. Alternatif cara mengkustomisasi aplikasi adalah dengan memperluas CWebApplication.

Konfigurasi adalah array pasangan kunci-nilai. Setiap kunci mewakili nama properti turunan aplikasi, dan setiap nilai adalah nilai awal dari properti tersebut. Sebagai contoh, koonfigurasi berikut mengkonfigurasi aplikasi name dan properti defaultController.

array(
'name'=>'Yii Framework',
'defaultController'=>'site',
)

Biasanya kami menyimpan konfigurasi dalam naskah PHP terpisah (misal protected/config/main.php). Di dalam naskah, kami mengembalikan array konfigurasi sebagai berikut,

return array(...);

Untuk menerapkan konfigurasi, kami mengoper nama file konfigurasi sebagai parameter bagi pembentuk aplikasi, atau ke Yii::createWebApplication() seperti yang berikut, yang biasanya dikerjakan dalam naskah entri:

$app=Yii::createWebApplication($configFile);

Tip: Jika konfigurasi aplikasi sangat kompleks, kami dapat memisahannya ke dalam beberapa file, masing-masing mengembalikan bagian array konfigurasi. Selanjutnya, dalam file konfigurasi utama, kami memanggil PHP include() guna menyertakan file konfigurasi lainnya dan menggabungkannya ke dalam array konfigurasi yang lengkap.

Direktori Basis Aplikasi

Direktori basis aplikasi merujuk ke direktori root yang berisi semua data dan naskah PHP sensitif-keamanan. Standarnya, ia berupa subdirektori bernama protected yang ditempatkan di bawah direktori yang berisi naskah entri. Ia dapat dikustomisasi melalui setelan properti basePath dalam konfigurasi aplikasi.

Isi di dalam direktori basis aplikasi harus dilindungi dari akses oleh para pengguna Web. Dengan Apache HTTP server, ini bisa dilakukan secara mudah dengan menempatkan file .htaccess di bawah direktori basis. Adapun isi file .htaccess adalah sebagai berikut,

deny from all

Komponen Aplikasi

Fungsionalitas aplikasi dapat dikustomisasi secara mudah dan diperkaya dengan arsitektur komponennya yang fleksibel. Aplikasi mengatur satu set komponen aplikasi, masing-masing mengimplementasi fitur tertentu. Sebagai contoh, aplikasi memecahkan permintaan pengguna dengan bantuan komponen CUrlManager dan CHttpRequest.

Dengan mengkonfigurasi properti komponen aplikasi, kita bisa mengkustomisasi kelasi dan nilai properti setiap komponen aplikasi yang dipakai dalam sebuah aplikasi. Sebagai contoh, kita dapat mengkonfigurasi komponen CMemCache agar ia bisa menggunakan multipel server memcache untuk caching,

array(
......
'components'=>array(
......
'cache'=>array(
'class'=>'CMemCache',
'servers'=>array(
array('host'=>'server1', 'port'=>11211, 'weight'=>60),
array('host'=>'server2', 'port'=>11211, 'weight'=>40),
),
),
),
)

Dalam contoh di atas, kita menambahkan elemen cache pada array components. Elemen cache menyatakan bahwa kelas komponennya adalah CMemCache dan properti servers juga harus diinisialisasi.

Untuk mengakses komponen aplikasi, gunakan Yii::app()->ComponentID, di mana ComponentID merujuk pada ID komponen (contoh Yii::app()->cache).

Komponen aplikasi dapat dimatikan dengan menyetel enabled menjadi false dalam konfigurasinya. Null dikembalikan saat kita mengakses komponen yang dimatikan.

Tip: Secara standar, komponen aplikasi dibuat bila diperlukan. Ini berarti komponen aplikasi mungkin tidak dibuat sama sekali jika tidak diakses saat pengguna meminta. Hasilnya, performansi keseluruhan mungkin tidak menurun walaupun aplikasi dikonfigurasi dengan banyak komponen. Beberapa komponen aplikasi (contoh CLogRouter) mungkin perlu dibuat tidak peduli apakah ia diakses atau tidak. Untuk melakukannya, daftarkan ID masing-masing dalam properti preload aplikasi.

Komponen Aplikasi Inti

Yii sudah mendefinisikan satu set komponen aplikasi inti guna menyediakan fitur yang umum dalam aplikasi Web. Sebagai contoh, komponen request dipakai untuk memecahkan permintaan pengguna dan menyediakan informasi seperti URL, cookies. Dengan mengkonfigurasi properti komponen inti ini, kita dapat mengubah perilaku standar Yii dalam hampir segala aspek.

Di bawah ini kami mendata komponen inti yang dideklarasikan oleh CWebApplication.

Siklus Aplikasi

Ketika menangani permintaan pengguna, aplikasi akan berada dalam siklus masa hidup sebagai berikut:

  1. Menyiapkan kelas autoloader dan penanganan kesalahan;

  2. Meregistrasi komponen inti aplikasi;

  3. Mengambil konfigurasi aplikasi;

  4. Menginisialisasi aplikasi dengan CApplication::init()

    • Mengambil komponen statis aplikasi;
  5. Menghidupkan event onBeginRequest;

  6. Mengolah permintaan pengguna:

    • Memecah permintaan pengguna;
    • Membuat pengontrol;
    • Menjalankan pengontrol;
  7. Menghidupkan event onEndRequest;

Naskah Entri

Naskah entri adalah naskah bootstrap PHP yang menangani awal permintaan penguna initially. Ia satu-satunya naskah PHP yang diminta pengguna yang secara langsung bisa dijalankan.

Dalam banyak hal, naskah entri aplikasi Yii berisi kode yang sesederhana seperti berikut,

// hapus baris berikut saat dalam mode produksi
defined('YII_DEBUG') or define('YII_DEBUG',true);
// sertakan file bootstrap Yii
require_once('path/to/yii/framework/yii.php');
// buat turunan aplikasi dan jalankan
$configFile='path/to/config/file.php';
Yii::createWebApplication($configFile)->run();

Pertama naskah menyertakan file boostrap Yii framework, yii.php. Selanjutnya membuat turunan aplikasi Web dengan konfigurasi yang sudah ditetapkan dan menjalankannya.

Mode Debug

Aplikasi Yii dapat berjalan baik dalam mode debug ataupun produksi berdasarkan pada nilai konstan YII_DEBUG. Secara standar, nilai konstan ini didefinisikan sebagai false, berarti mode produksi. Untuk dijalankan dalam mode debug, definisikan konstan ini menjadi true sebelum menyertakan file yii.php. Menjalankan aplikasi dalam mode debug kurang efisien karena ia memelihara banyak log internal. Di sisi lain, mode debug juga lebih membantu selama tahap pengembangan karena ia menyediakan banyak informasi debug saat terjadi kesalahan.

Model-View-Controller (MVC)

Yii mengimplementasikan pola desain model-view-controller (MVC) atau model-tampilan-kontroler yang secara luas diadopsi dalam pemrograman Web. MVC bertujuan untuk memisahkan logika bisnis dari pertimbangan antar muka pengguna agar para pengembang bisa lebih mudah mengubah setiap bagian tanpa mempengaruhi yang lain. Dalam MVC, model menggambarkan informasi (data) dan aturan bisnis; tampilan berisi elemen antar muka pengguna seperti teks, formulir input; sementara kontroler mengatur komunikasi antar model dan tampilan.

Selain MVC, Yii juga memperkenalkan kontroler-depan, disebut aplikasi, yang menggambarkan berjalannya konteks proses permintaan. Aplikasi memecah permintaan pengguna dan membaginya ke kontroler yang sesuai untuk penanganan selanjutnya.

Diagram berikut memperlihatkan struktur statis sebuah aplikasi Yii:

Struktur statis aplikasi Yii

Struktur statis aplikasi Yii

Alur kerja Umum

Diagram berikut memperlihatkan alur kerja umum sebuah aplikasi Yii saat menangani permintaan pengguna:

Alur kerja umum aplikasi Yii

Alur kerja umum aplikasi Yii
  1. Pengguna membuat permintaan dengan URL http://www.example.com/index.php?r=post/show&id=1 dan server Web menangani permintaan dengan menjalankan naskah bootstrap index.php.
  2. Naskah bootstrap membuat turunan aplikasi dan menjalankannya.
  3. Alikasi mendapatkan rincian informasi permintaan pengguna dari komponen aplikasi bernama request.
  4. Aplikasi menentukan kontroler dan aksi yang diminta dengan bantuan komponen aplikasi bernama urlManager. Dalam contoh ini, kontroler adalah post yang merujuk pada kelas PostController; dan aksi adalah show yang arti sebenarnya ditentukan oleh kontroler.
  5. Aplikasi membuat turunan kontroler yang diminta untuk selanjutnya menangani permintaan pengguna. Kontroler menentukan aksi show merujuk pada sebuah metode bernama actionShow dalam kelas kontroler. Kemudian membuat dan menjalankan filter (contoh kontrol akses, pengukuran) terkait dengan aksi ini. Aksi dijalankan jika diijinkan oleh filter.
  6. Aksi membaca Post model di mana ID adalah 1 dari database.
  7. Aksi meyiapkan tampilan bernama show dengan model Post.
  8. Tampilan membaca dan menampilkan atribut model Post.
  9. Tampilan menjalankan beberapa widget.
  10. Tampilan menyiapkan hasil yang dilengketkan dalam tata letak.
  11. Aksi menyempurnakan pembuatan tampilan dan menampilkan hasil akhir kepada pengguna.