Sederhananya, peran pengontrol adalah menerima permintaan. Ia menggunakan metode get, dalam hal ini melalui URI, untuk memuat modul fungsi untuk menyegarkan atau mengirimkan lapisan presentasi. Pengontrol akan menggunakan variabel global otomatis $_GET untuk menentukan modul mana yang akan dimuat.
Contoh permintaan akan terlihat seperti ini:
http://example.com/index.php?module=login
Ini terlihat sederhana, namun dalam proses implementasinya tidak. Berikut adalah bagian argumen yang dapat dikenali oleh beberapa pengontrol:
modul mendefinisikan modul mana yang akan digunakan, seperti pengguna. Kelas modul mendefinisikan kelas fungsional mana yang akan digunakan, seperti apakah Anda ingin pengguna masuk atau keluar.
event menentukan event spesifik mana yang akan digunakan.
Contoh yang lebih kompleks dapat menjelaskan URL permintaan yang pada akhirnya terdiri dari setiap argumen di atas
:
http://example.com/index.php?module=users&class=login
itu harus Memuat modul pengguna, lalu kelas login, dan akhirnya menjalankan acara default login::__default() karena tidak ada acara spesifik yang ditentukan.
Berikut ini adalah bagian kode spesifiknya:
<?php
/**
*indeks.php
*
* @penulis Joe Stump < [email protected] >
* @hak cipta Joe Stump < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php');
// {{{ __autoload($kelas)
/**
* __muat otomatis
*
* Autoload dijalankan oleh PHP ketika tidak dapat menemukan kelas yang coba dimuat.
* Dengan memberi nama kelas secara cerdas, kita seharusnya dapat memuat sebagian besar kelas
* secara dinamis.
*
* @penulis Joe Stump < [email protected] >
* @param string $class Nama kelas yang kami coba muat
* @pengembalian batal
* @packageFramework
*/
fungsi __autoload($kelas)
{
$file = str_replace('_','/',substr($kelas,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['modul'])) {
$modul = $_GET['modul'];
if (isset($_GET['acara'])) {
$acara = $_GET['acara'];
} kalau tidak {
$peristiwa = '__default';
}
if (isset($_GET['kelas'])) {
$kelas = $_GET['kelas'];
} kalau tidak {
$kelas = $modul;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
if (file_exists($classFile)) {
require_once($classFile);
if (kelas_ada($kelas)) {
mencoba {
$instance = baru $kelas();
if (!FR_Module::isValid($instance)) {
die("Modul yang diminta bukan modul framework yang valid!");
}
$instance->Namamodul = $modul;
if ($instance->otentikasi()) {
mencoba {
$hasil = $instance->$acara();
if (!PEAR::isError($hasil)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance);
if (!PEAR::isError($presenter)) {
$presenter->tampilan();
} kalau tidak {
mati($presenter->getMessage());
}
}
} tangkapan (Pengecualian $kesalahan) {
mati($kesalahan->getMessage());
}
} kalau tidak {
die("Anda tidak mempunyai akses ke halaman yang diminta!");
}
} tangkapan (Pengecualian $kesalahan) {
mati($kesalahan->getMessage());
}
} kalau tidak {
die("Modul valid untuk permintaan Anda tidak ditemukan");
}
} kalau tidak {
die("Tidak dapat menemukan: $classFile");
}
} kalau tidak {
die("Modul yang valid tidak ditentukan");
}
?>
Berikut ini adalah komentar spesifik pada kode di atas:
muat "config.php"
untuk mendefinisikan fungsi __autoload(). Ini adalah fungsi baru di PHP5, yang memfasilitasi pemuatan dinamis berbagai kelas.
Jika argumen ditentukan, maka modul, kelas, dan peristiwa tertentu yang relevan dimuat,
diikuti
oleh beberapa penilaian dan operasi kesalahan tertentu.
Terakhir, setelah semuanya benar, lapisan presentasi
[URL ramah]
dimuatdisebutkan dalam contoh di atas adalah Jika membuat Anda merasa tidak nyaman, gunakan mod_rewrite untuk mengimplementasikan URL ramah. Berikutnya adalah kode standar penulisan ulang sebenarnya yang ditulis oleh penulis untuk kerangka kerja ini:
RewriteEngine On
# Ubah URI di sini menjadi apa pun yang Anda inginkan untuk beranda Anda
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# Perubahan / index.php?module=selamat datang di /selamat datang
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# Mengubah /index.php?module=users&class=login menjadi /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# Perubahan /index.php?module=users&class=login&event =foo
# ke /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
Memperluas Pengontrol
[Pengendali Diperluas]
memiliki pengontrol terpusat Salah satu kelebihannya adalah setelah Anda menambahkan beberapa fungsi, fungsi tersebut dapat langsung direfleksikan melalui pengontrol. Berikut adalah beberapa ide untuk memperluas pengontrol ini agar kerangka kerja lebih kuat secara keseluruhan:
Anda dapat menggunakan SoapServer, hal baru di PHP5, untuk secara otomatis mendeteksi apakah suatu permintaan adalah SOAP.
Anda dapat menggunakan pengontrol untuk
mencegah kode HTML berbahaya, dll.
mengonversi ekspresi dengan cepat, misalnya, dari mode default ke mode PDF
,
Anda dapat langsung menambahkan mekanisme caching di pengontrol.
satu hal yang perlu diperhatikan adalah Anda berada di pengontrol. Fungsionalitas tambahan akan tercermin dalam keseluruhan program. Misalnya, Anda ingin memfilter semua variabel global otomatis, tetapi banyak administrator aplikasi perlu menggunakan beberapa kode HTML, yang menjadi hal yang rumit (Catatan Penerjemah: Ide saya adalah menambahkan pernyataan kondisional if untuk memuat modul tertentu tanpa menerapkan pemfilteran fungsi).