พูดง่ายๆ ก็คือ บทบาทของผู้ควบคุมคือการยอมรับคำขอ โดยจะใช้วิธี get ในกรณีนี้ผ่าน URI เพื่อโหลดโมดูลฟังก์ชันเพื่อรีเฟรชหรือส่งเลเยอร์การนำเสนอ คอนโทรลเลอร์จะใช้ตัวแปรโกลบอลอัตโนมัติ $_GET เพื่อกำหนดโมดูลที่จะโหลด
ตัวอย่างของคำขอจะมีลักษณะดังนี้:
http://example.com/index.php?module=login
ดูเหมือนง่าย แต่ในกระบวนการนำไปใช้งานกลับไม่เป็นเช่นนั้น ต่อไปนี้เป็นส่วนอาร์กิวเมนต์ที่ตัวควบคุมหลายตัวสามารถรับรู้ได้:
โมดูล กำหนดโมดูลที่จะใช้ เช่น ผู้ใช้ คลาสโมดูลกำหนดคลาสการทำงานที่จะใช้ เช่น คุณต้องการให้ผู้ใช้เข้าสู่ระบบหรือออกจากระบบ
เหตุการณ์จะกำหนดเหตุการณ์เฉพาะที่จะใช้
ที่
ซับซ้อนมากขึ้นสามารถอธิบาย URL คำขอที่ท้ายที่สุดแล้วประกอบด้วยแต่ละอาร์กิวเมนต์ด้านบน:
http://example.com/index.php?module=users&class=login
มันควรโหลดโมดูล users จากนั้นคลาสล็อกอินและสุดท้ายรันเหตุการณ์เริ่มต้นล็อกอิน::__default() เนื่องจากไม่มีการกำหนดเหตุการณ์เฉพาะ
ต่อไปนี้เป็นส่วนรหัสเฉพาะ:
<?php
-
*index.php
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @copyright โจ สตัมป์ < [email protected] ><
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
need_once('config.php');
// {{{ __autoload($คลาส)
-
* __โหลดอัตโนมัติ
-
* Autoload ทำงานโดย PHP เมื่อไม่พบคลาสที่พยายามโหลด
* ด้วยการตั้งชื่อคลาสของเราอย่างชาญฉลาด เราควรจะสามารถโหลดคลาสส่วนใหญ่ได้
* แบบไดนามิก
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @param string $class ชื่อคลาสที่เรากำลังพยายามโหลด
* @return เป็นโมฆะ
* @packageFramework
*/
ฟังก์ชั่น __โหลดอัตโนมัติ($คลาส)
-
$file = str_replace('_','/',substr($class,2)).'.php';
need_once(FR_BASE_PATH.'/includes/'.$file);
-
// }}}
ถ้า (isset($_GET['โมดูล'])) {
$โมดูล = $_GET['โมดูล'];
ถ้า (isset($_GET['event'])) {
$เหตุการณ์ = $_GET['เหตุการณ์'];
} อื่น {
$เหตุการณ์ = '__ค่าเริ่มต้น';
}
ถ้า (isset($_GET['class'])) {
$คลาส = $_GET['คลาส'];
} อื่น {
$คลาส = $โมดูล;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
ถ้า (file_exists($classFile)) {
need_once($คลาสไฟล์);
ถ้า (class_exists($class)) {
พยายาม {
$instance = $คลาสใหม่();
ถ้า (!FR_Module::isValid($อินสแตนซ์)) {
die("โมดูลที่ร้องขอไม่ใช่โมดูลกรอบงานที่ถูกต้อง!");
}
$instance->moduleName = $module;
ถ้า ($อินสแตนซ์ -> รับรองความถูกต้อง ()) {
พยายาม {
$result = $instance->$event();
ถ้า (!PEAR::isError($ผลลัพธ์)) {
$presenter = FR_Presenter::factory($instance->ผู้นำเสนอ,$instance);
if (!PEAR::isError($presenter)) {
$ผู้นำเสนอ->จอแสดงผล();
} อื่น {
ตาย($ผู้นำเสนอ->getMessage());
-
-
} catch (ข้อยกเว้น $error) {
ตาย($error->getMessage());
-
} อื่น {
die("คุณไม่สามารถเข้าถึงหน้าที่ร้องขอได้!");
-
} catch (ข้อยกเว้น $error) {
ตาย($error->getMessage());
-
} อื่น {
die("ไม่พบโมดูลที่ถูกต้องสำหรับคำขอของคุณ");
-
} อื่น {
die("ไม่พบ: $classFile");
-
} อื่น {
die("ไม่ได้ระบุโมดูลที่ถูกต้อง");
}
?>
ต่อไปนี้เป็นความคิดเห็นเฉพาะเกี่ยวกับโค้ดข้างต้น:
โหลด "config.php"
เพื่อกำหนดฟังก์ชัน __autoload() นี่เป็นฟังก์ชันใหม่ใน PHP5 ซึ่งอำนวยความสะดวกในการโหลดคลาสต่างๆ แบบไดนามิก
หากมีการกำหนดอาร์กิวเมนต์ โมดูล คลาส และเหตุการณ์เฉพาะที่เกี่ยวข้องจะถูกโหลด
ตามด้วยการตัดสินและการดำเนินการข้อผิดพลาดเฉพาะ
ในที่สุด หลังจากที่ทุกอย่างถูกต้องแล้ว เลเยอร์การนำเสนอ
[URL ที่จำง่าย]
จะถูกโหลดหากคุณคิดว่า URL คำขอ ที่กล่าวถึงในตัวอย่างข้างต้นคือ ถ้ามันทำให้คุณรู้สึกไม่สบายใจ ให้ใช้ mod_rewrite เพื่อปรับใช้ URL ที่จำง่าย ถัดไปคือโค้ดมาตรฐานการเขียนใหม่จริงที่เขียนโดยผู้เขียนสำหรับเฟรมเวิร์กนี้:
RewriteEngine On
# เปลี่ยน URI ที่นี่เป็นอะไรก็ได้ที่คุณต้องการให้หน้าแรกของคุณเป็น
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# Changes / index.php?module=ยินดีต้อนรับสู่ /ยินดีต้อนรับ
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# เปลี่ยน /index.php?module=users&class=login เป็น /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# การเปลี่ยนแปลง /index.php?module=users&class=login&event =foo
# ถึง /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]
การขยายตัวควบคุม
[ตัวควบคุมแบบขยาย]
มีตัวควบคุมแบบรวมศูนย์ หนึ่งในนั้น ข้อดีคือหลังจากที่คุณเพิ่มฟังก์ชันบางอย่างเข้าไปแล้ว ฟังก์ชันเหล่านั้นสามารถสะท้อนให้เห็นได้ทันทีผ่านตัวควบคุม ต่อไปนี้เป็นแนวคิดบางประการในการขยายคอนโทรลเลอร์นี้เพื่อทำให้เฟรมเวิร์กมีประสิทธิภาพโดยรวมมากขึ้น:
คุณสามารถใช้ SoapServer ซึ่งเป็นสิ่งใหม่ใน PHP5 เพื่อตรวจจับโดยอัตโนมัติว่าคำขอนั้นเป็น SOAP หรือไม่
คุณสามารถใช้ตัวควบคุมเพื่อกรองตัวแปรส่วนกลางอัตโนมัติทั้งหมด เช่น $_GET และ $_POST เพื่อป้องกันโค้ด HTML ที่เป็นอันตราย เป็นต้น
คุณสามารถใช้ตัวควบคุมเพื่อ แปลงนิพจน์ได้ทันที ตัวอย่างเช่น เลเยอร์จากโหมดเริ่มต้นเป็นโหมด PDF
คุณสามารถเพิ่มกลไกการแคชในคอนโทรลเลอร์ได้โดยตรง ข้อดีของสิ่งนี้คือแอปพลิเคชันทั้งหมดสามารถใช้แคชเพื่อปรับปรุงประสิทธิภาพได้
แน่นอน สิ่งหนึ่งที่ควรทราบก็คือคุณอยู่ในตัวควบคุม ฟังก์ชันที่เพิ่มเข้ามาจะสะท้อนให้เห็นในโปรแกรมโดยรวม ตัวอย่างเช่น คุณต้องการกรองตัวแปรส่วนกลางอัตโนมัติทั้งหมด แต่ผู้ดูแลระบบแอปพลิเคชันจำนวนมากจำเป็นต้องใช้โค้ด HTML ซึ่งกลายเป็นเรื่องยุ่งยาก (หมายเหตุผู้แปล: ความคิดของฉันคือการเพิ่มคำสั่งแบบมีเงื่อนไขเพื่อโหลดโมดูลเฉพาะโดยไม่ต้องใช้การกรอง การทำงาน).