[MVC คืออะไร? 】
MVC เป็นแนวคิดที่ช่วยให้คุณสามารถรวม "สามส่วน (ได้แก่ ชื่อเต็มของ MVC, รุ่น, มุมมอง และตัวควบคุม)" เข้าด้วยกันอย่างกลมกลืนเพื่อสร้างแอปพลิเคชันที่ซับซ้อน รถยนต์เป็นตัวอย่างที่ดีของ MVC ในชีวิตจริง เมื่อเราดูรถยนต์เราจะดูที่ View (จอแสดงผล) สองส่วน: ภายในและภายนอก ทั้งสองสิ่งนี้แยกออกจากคอนโทรลเลอร์ไม่ได้: ไดรเวอร์ ระบบเบรก พวงมาลัย และระบบควบคุมอื่นๆ เป็นตัวแทนของโมเดล โดยใช้วิธีการควบคุมจากคนขับ (คอนโทรลเลอร์) และนำไปใช้กับภายในและภายนอก (มุมมอง)
[MVC บนเว็บ]
แนวคิดที่ครอบคลุมโดยกรอบงาน MVC นั้นค่อนข้างเรียบง่ายและยืดหยุ่นอย่างยิ่ง แนวคิดพื้นฐานคือคุณมีตัวควบคุมตัวเดียว (เช่น index.php) ที่ควบคุมแอปพลิเคชันทั้งหมดภายในกรอบงานที่อิงตามคำขอพารามิเตอร์ คอนโทรลเลอร์นี้มักจะมี (น้อยที่สุด) พารามิเตอร์ที่กำหนดโมเดล เหตุการณ์ และพารามิเตอร์ GET วิธีนี้ทำให้ผู้ควบคุมสามารถรับทราบคำขอทั้งหมดและเรียกใช้เหตุการณ์ที่เหมาะสมได้ ตัวอย่างเช่น คำขอเช่นนี้ /index.php?module=foo&event=bar อาจใช้เพื่อโหลดคลาสชื่อ foo จากนั้นเรียกใช้ foo::bar()[ซึ่งก็คือ bar( )function] ข้อดีของสิ่งนี้คือ:
การดูแลรักษาอินเทอร์เฟซสำหรับแอปพลิเคชันทั้งหมด
ในขณะที่การรักษารหัสจำนวนนับไม่ถ้วนในแอปพลิเคชันนั้นเป็นเรื่องที่ลำบากมาก เนื่องจากโค้ดแต่ละชิ้นมีเส้นทางสัมพันธ์กัน ลิงก์ฐานข้อมูล การตรวจสอบ ฯลฯ การทำเช่นนี้จะช่วยคุณประหยัดปัญหาและช่วยให้คุณสามารถรวมและนำโค้ดกลับมาใช้ใหม่ได้
[ทำไมต้องสร้างเฟรมเวิร์ก MVC ของคุณเอง? ]
จนถึงตอนนี้ ฉันยังไม่เคยเห็น MVC frameworks มากมายที่เขียนด้วย PHP มากนัก อันที่จริงฉันรู้เพียงอันเดียว - Solar ซึ่งเขียนด้วย PHP5 ทั้งหมด อีกประการหนึ่งคือ Cake ซึ่งพยายามเป็น RoR (Ruby on Rails - เฟรมเวิร์กเครือข่ายโอเพ่นซอร์สสำหรับภาษา Ruby) ของ PHP ตัวฉันเองมีความไม่พอใจกับทั้งสองเฟรมเวิร์ก: พวกเขาไม่ได้ใช้ประโยชน์จากโค้ดที่มีอยู่ใน PEAR, Smarty ฯลฯ; Cake ปัจจุบันยังค่อนข้างยุ่งเหยิง ในที่สุด Solar ก็เป็นเฟรมเวิร์กที่เขียนโดยบุคคลเพียงคนเดียว (ฉันมี ไม่มีเจตนาจะบอกว่าผู้เขียน พอล ไม่ใช่คนดีหรือโปรแกรมเมอร์ที่ดี) คำถามเหล่านี้อาจไม่ทำให้คุณปฏิเสธและมีโอกาสที่คุณจะไม่สนใจคำถามเหล่านี้เลย แต่ด้วยเหตุนี้ฉันขอให้คุณดูพวกเขาให้มากที่สุด
[แบบเก่า]
หากคุณย้อนกลับไปปี 2001 แล้วดูโค้ดที่คุณเขียน ผู้เขียนอาจพบไฟล์ชื่อ template.txt ซึ่งมีลักษณะดังนี้: www.phpv.net โปรดระบุแหล่งที่มาสำหรับการพิมพ์ซ้ำ
<?php
need_once('config.php'); // อื่นๆ ต้องการ, ข้อมูล DB, ฯลฯ
$APP_DB = 'mydb';
$APP_REQUIRE_LOGIN = false; // ตั้งค่าเป็นจริงหากสคริปต์จำเป็นต้องเข้าสู่ระบบ
$APP_TEMPLATE_FILE = 'foo.php'; // เทมเพลตอันชาญฉลาด
$APP_TITLE = 'ใบสมัครของฉัน';
ถ้า ($APP_REQUIRE_LOGIN == true) {
ถ้า (!isset($_SESSION['userID'])) {
header("ตำแหน่ง: /path/to/login.php");
ออก();
-
}
$db = DB::connect('mysql://'.$DB_USER.':'.$DB_PASS.'@localhost/'.$APP_DB);
ถ้า (!PEAR::isError($db)) {
$db->setFetchMode(DB_FETCHMODE_ASSOC);
} อื่น {
ตาย($db->getMessage());
}
// ใส่ตรรกะของคุณที่นี่
// ส่งออกเทมเพลต
include_once(APP_TEMPLATE_PATH.'/header.php');
include_once(APP_TEMPLATE_PATH.'/'.$APP_TEMPLATE_FILE);
include_once(APP_TEMPLATE_PATH.'/footer.php');
?>
โอ้พระเจ้า แค่เห็นโค้ดนี้ฉันก็แทบประจบประแจงแล้ว แนวคิดของโค้ดนี้คือเพื่อให้แน่ใจว่าทุกแอปพลิเคชันสามารถปรับให้เข้ากับวิธีการประมวลผลนี้ได้ ตัวอย่างเช่น ฉันสามารถคัดลอก template.txt ลงใน myapp.php เปลี่ยนตัวแปรบางตัว จากนั้นโค้ดจะทำงาน อย่างไรก็ตาม วิธีการที่มีการจัดระเบียบอย่างดีนี้มีข้อบกพร่องร้ายแรงบางประการ: จะเกิดอะไรขึ้น
ถ้าเจ้านายของฉันต้องการให้ผู้เขียนใช้ myapp.php เพื่อส่งออก PDF ในบางกรณี, HTML ในบางกรณี และ SOAP ในบางกรณี (ส่งคำขอ XML โดยตรง) ฉันควรทำอย่างไร ทำ?
ฉันควรทำอย่างไรหากแอปนี้ต้องใช้การตรวจสอบสิทธิ์ IMAP หรือ LDAP
ฉันจะจัดการกับโค้ดประเภทต่างๆ ได้อย่างไร (รวมถึงการแก้ไข อัปเกรด และการลบ)
ฉันจะจัดการการรับรองความถูกต้องหลายระดับ (ผู้ดูแลระบบและไม่ใช่ผู้ดูแลระบบ) ได้อย่างไร
ฉันจะเปิดใช้งานการแคชเอาต์พุตได้อย่างไร www.phpv.net โปรดระบุแหล่งที่มาสำหรับการพิมพ์ซ้ำ
[วิธีใหม่]
ใส่ทุกอย่างลงในกรอบงาน MVC นี้แล้วคุณจะพบว่าชีวิตนั้นเรียบง่ายมาก กรุณาเปรียบเทียบรหัสต่อไปนี้:
<?php
คลาส myapp ขยาย FR_Auth_User
-
ฟังก์ชั่นสาธารณะ __ สร้าง ()
-
ผู้ปกครอง::__ สร้าง ();
}
ฟังก์ชั่นสาธารณะ __default()
-
//ทำอะไรสักอย่างที่นี่
}
ฟังก์ชั่นสาธารณะ ลบ()
{ }
ฟังก์ชั่นสาธารณะ __destruct()
-
ผู้ปกครอง::__ ทำลาย ();
-
}
?>
โปรดทราบว่ารหัสนี้ไม่ได้ใช้เพื่อเชื่อมโยงไปยังฐานข้อมูล ตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือส่งออกข้อมูลอื่นใดหรือไม่ ผู้ควบคุมมีทุกอย่าง
หากฉันต้องการตรวจสอบสิทธิ์ LDAP ฉันสามารถสร้าง FR_Auth_LDAP ได้ คอนโทรลเลอร์สามารถจดจำวิธีการส่งออกบางอย่างได้ (เช่น $_GET['output']) และสามารถแปลงเป็น PDF หรือ SOAP ได้ตลอดเวลา การลบตัวจัดการเหตุการณ์มีหน้าที่รับผิดชอบในการลบเท่านั้นและไม่สนใจสิ่งอื่นใด เนื่องจากโมดูลนี้มีอินสแตนซ์ของคลาส FR_User จึงสามารถระบุได้ว่าผู้ใช้เข้าสู่ระบบหรือไม่ ฯลฯ Smarty ในฐานะเอ็นจิ้นเทมเพลต จะควบคุมแคชตามธรรมชาติ แต่ตัวควบคุมก็สามารถควบคุมส่วนหนึ่งของแคชได้เช่นกัน
การเปลี่ยนจากวิธีเก่าที่กล่าวมาข้างต้นไปสู่วิธี MVC อาจเป็นแนวคิดใหม่ที่ไม่คุ้นเคยสำหรับหลายๆ คน แต่เมื่อคุณเปลี่ยนมาใช้แนวคิดดังกล่าวแล้ว จะค่อนข้างยากที่จะเปลี่ยนกลับ
[สร้างชั้นล่างสุด]
ฉันเป็นแฟนตัวยงของ PEAR โดยเฉพาะคลาส PEAR_Error PHP5 แนะนำคลาส "Exception" ในตัวใหม่ซึ่งแทนที่ PEAR_Error แต่ PEAR_Error มีคุณลักษณะที่เป็นประโยชน์มากกว่าข้อยกเว้น ดังนั้น ตัวอย่างกรอบงาน MVC ในชุดบทความนี้จะใช้สำหรับการจัดการข้อผิดพลาด อย่างไรก็ตาม ฉันยังคงต้องใช้ Exception เพื่อรับข้อผิดพลาดจาก Constructor เนื่องจากไม่สามารถส่งกลับข้อผิดพลาดได้ด้วยตนเอง
วัตถุประสงค์ของการออกแบบคลาสพื้นฐานเหล่านี้มีดังนี้:
ใช้ PEAR เพื่อเพิ่มฟังก์ชันให้กับคลาสพื้นฐานอย่างรวดเร็ว
เพื่อสร้างคลาสนามธรรมขนาดเล็กที่ใช้งานได้จริงเพื่อให้ผู้ใช้สามารถพัฒนาแอปพลิเคชันในเฟรมเวิร์กนี้ได้อย่างรวดเร็ว
ใช้
phpDocumentor เพื่อสร้างเอกสารสำหรับคลาสพื้นฐานทั้งหมด
ลำดับชั้นของคลาสจะมีลักษณะดังนี้:
- FR_Object จะให้ฟังก์ชันการทำงานพื้นฐานสำหรับวัตถุอื่น ๆ ทั้งหมดที่จะใช้ (รวมถึงการบันทึก, setFrom(), toArray()) ทั่วไป
- FR_Object_DB เป็นเลเยอร์ขนาดเล็กที่ให้ลิงก์ฐานข้อมูลไปยังคลาสย่อยและฟังก์ชันอื่น ๆ
- FR_Module คือ คลาสด้านล่างของแอปพลิเคชันทั้งหมด (หรือที่เรียกว่าโมดูล โมเดล ฯลฯ)
- FR_Auth เป็นคลาสด้านล่างสุดของกลไกการตรวจสอบทั้งหมด
· FR_Auth_User เป็นคลาสการตรวจสอบที่ใช้ในการตรวจสอบโมดูลทั้งหมดที่ต้องตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่
· FR_Auth_No คือ "คลาสการตรวจสอบปลอม" ทั้งหมดสำหรับโมดูลที่ไม่ต้องการการตรวจสอบ
- FR_Presenter เป็นคลาสพื้นฐานสำหรับแอปพลิเคชันทั้งหมดที่จัดการการโหลดและการแสดงผล
- FR_Presenter_Smarty เป็นเลเยอร์การนำเสนอที่มีความสามารถในการโหลดไดรฟ์ต่างๆ Smarty เป็นคลาสเทมเพลตที่ดีมาก มีกลไกแคชในตัวและกลุ่มการพัฒนาที่ใช้งานอยู่ (หมายเหตุผู้แปล: เห็นได้ชัดว่านี่คือโฆษณา ~)
· FR_Presenter_debug เป็นเลเยอร์การแสดงผลของส่วนการดีบัก นักพัฒนาสามารถแก้ไขข้อบกพร่องของแอปพลิเคชันและแก้ไขข้อบกพร่องเหล่านั้นได้
FR_Presenter_rest เป็นเลเยอร์การนำเสนอ REST ที่ช่วยให้นักพัฒนาสามารถส่งออกแอปพลิเคชันใน
รูปแบบ XML ข้างต้น คุณควรจะเห็นส่วนต่างๆ ของ MVC FR_Module มอบทุกสิ่งที่โมดูลต้องการ ในขณะที่ FR_Presenter มีวิธีการแสดงผลที่แตกต่างกัน ในบทความถัดไปในชุดนี้ ฉันจะสร้างคอนโทรลเลอร์ที่เชื่อมโยงคลาสพื้นฐานข้างต้นทั้งหมดเข้าด้วยกัน
[มาตรฐานการเข้ารหัส]
ก่อนที่คุณจะเขียนโค้ดอย่างเป็นทางการ คุณควรนั่งลงและหารือ (หรือคิดถึง) มาตรฐานการเข้ารหัสกับคู่ค้าของคุณ (หรือตัวคุณเอง) แนวคิดโดยรวมของการเขียนโปรแกรม MVC หมุนรอบสองจุด: การนำโค้ดกลับมาใช้ใหม่ (ลดความบังเอิญ) และการกำหนดมาตรฐานของโค้ด ฉันแนะนำอย่างน้อยประเด็นต่อไปนี้ที่ต้องพิจารณา:
สิ่งแรกที่ต้องพิจารณาคือการตั้งชื่อตัวแปรและมาตรฐานตัวย่อ อย่าทะเลาะวิวาทกับคู่รักของคุณด้วยเหตุนี้ แต่เมื่อได้กำหนดมาตรฐานแล้ว พวกเขาจะต้องปฏิบัติตามตั้งแต่ต้นจนจบ โดยเฉพาะอย่างยิ่งเมื่อเขียนโค้ดระดับต่ำ (คลาสพื้นฐาน)
ปรับแต่งคำนำหน้ามาตรฐานเพื่อใช้กับฟังก์ชัน คลาส และตัวแปรร่วมทั้งหมด ขออภัย PHP ไม่รองรับ "เนมสเปซ (เนมสเปซ)" ดังนั้นเพื่อหลีกเลี่ยงความสับสนและความขัดแย้งกับชื่อตัวแปร จึงควรใช้คำนำหน้า ฉันจะใช้ "FR_" เป็นคำนำหน้าตลอดบทความนี้
[การเขียนชั้นล่างสุด]
การวางแผนระดับไฟล์มีความสำคัญมาก การวางแผนแบบลำดับชั้นขั้นพื้นฐานนั้นเรียบง่ายและค่อนข้างเข้มงวด:
/
config.php
ดัชนี.php
รวมถึง/
Auth.php
รับรองความถูกต้อง/
No.php
ผู้ใช้.php
โมดูล.php
วัตถุ.php
วัตถุ/
DB.php
ผู้นำเสนอ.php
พรีเซนเตอร์/
common.php
debug.php
smarty.php
สมาร์ทตี้/
โมดูล/
ตัวอย่าง/
config.php
ตัวอย่าง.php
ทีพีแอล/
ตัวอย่าง.tpl
ทีพีแอล/
ค่าเริ่มต้น/
แคช/
กำหนดค่า/
แม่แบบ/
templates_c/
คุณอาจคิดว่าลำดับชั้นของไฟล์ดังกล่าวต้องแสดงถึงโค้ดจำนวนมาก! จริงอยู่ แต่คุณทำได้ ในตอนท้ายของซีรีส์ คุณจะพบว่าการเขียนโปรแกรมของคุณจะง่ายขึ้น และความเร็วในการพัฒนาของคุณจะดีขึ้นอย่างมาก
ในลำดับชั้นของไฟล์ คลาสพื้นฐานทั้งหมดจะอยู่ในโฟลเดอร์รวม โมดูลการทำงานแต่ละโมดูลใช้ไฟล์การกำหนดค่า ไฟล์โมดูลอย่างน้อยหนึ่งไฟล์ และไฟล์เทมเพลตหนึ่งไฟล์ โมดูลทั้งหมดอยู่ในโฟลเดอร์โมดูล ฉันคุ้นเคยกับการวางไฟล์เทมเพลตไว้ในโฟลเดอร์ภายนอกที่แยกต่างหาก ซึ่งก็คือโฟลเดอร์ tpl
config.php - ไฟล์การกำหนดค่าส่วนกลางที่มีตัวแปรการกำหนดค่าส่วนกลางทั้งหมด
index.php - Controller จะมีการอธิบายโดยละเอียดในบทความถัดไป
object.php - คลาสพื้นฐานสำหรับคลาสพื้นฐานทั้งหมด มอบฟังก์ชันการทำงานส่วนใหญ่ที่คลาสต้องการ FR_Object_DB สืบทอดคลาสนี้และให้ลิงก์ฐานข้อมูล
แนวคิดพื้นฐานของโครงสร้างคือการให้คลาสย่อยทั้งหมดสืบทอดมาจากคลาสกลางเพื่อให้คลาสย่อยทั้งหมดใช้คุณสมบัติร่วมกันบางอย่างร่วมกัน คุณสามารถใส่ฟังก์ชันการเชื่อมโยงไปยังฐานข้อมูลลงใน FR_Object ได้ แต่ไม่ใช่ทุกคลาสที่ต้องการฟังก์ชันนี้ ดังนั้น FR_Object_DB จึงมีเหตุผลในการดำรงอยู่ และผู้เขียนจะหารือเกี่ยวกับเรื่องนี้ในภายหลัง
<?php
need_once('Log.php');
/**
*FR_วัตถุ
-
* คลาสอ็อบเจ็กต์พื้นฐานสำหรับคลาสส่วนใหญ่ที่เราใช้ในเฟรมเวิร์กของเรา
* ให้การบันทึกขั้นพื้นฐานและฟังก์ชันการตั้งค่า/รับ
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @packageFramework
*/
คลาสนามธรรม FR_Object
-
-
* $ล็อก
-
* @var ผสม $log อินสแตนซ์ของ PEAR Log
*/
ป้องกัน $log;
-
*$ฉัน
-
* @var ผสม $me อินสแตนซ์ของ ReflectionClass
*/
ป้องกัน $me;
-
* __สร้าง
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @เข้าถึงสาธารณะ
*/
ฟังก์ชั่นสาธารณะ __construct()
-
$this->log = Log::factory('file',FR_LOG_FILE);
$this->me = ReflectionClass ใหม่($this);
}
/**
* ตั้งค่าจาก
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @เข้าถึงสาธารณะ
* @param ผสม $data Array ของตัวแปรเพื่อกำหนดให้กับอินสแตนซ์
* @return เป็นโมฆะ
*/
ฟังก์ชั่นสาธารณะ setFrom($data)
-
ถ้า (is_array($data) && นับ($data)) {
$valid = get_class_vars(get_class($this));
foreach ($ใช้ได้เป็น $var => $val) {
ถ้า (isset($data[$var])) {
$this->$var = $data[$var];
-
-
-
}
/**
* ถึงอาร์เรย์
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @เข้าถึงสาธารณะ
* @return อาร์เรย์ผสมของตัวแปรสมาชิกที่คีย์ด้วยชื่อตัวแปร
*/
ฟังก์ชั่นสาธารณะ toArray()
-
$defaults = $this->me->getDefaultProperties();
$return = array();
foreach ($ค่าเริ่มต้นเป็น $var => $val) {
ถ้า ($สิ่งนี้ -> $var อินสแตนซ์ของ FR_Object) {
$return[$var] = $this->$var->toArray();
} อื่น {
$return[$var] = $this->$var;
-
}
ส่งคืน $ ส่งคืน;
}
/**
* __ทำลาย
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @เข้าถึงสาธารณะ
* @return เป็นโมฆะ
*/
ฟังก์ชั่นสาธารณะ __destruct()
-
ถ้า ($ นี้ -> บันทึกอินสแตนซ์ของบันทึก) {
$นี่->บันทึก->ปิด();
-
-
}
?>
auth.php – นี่คือคลาสพื้นฐานสำหรับฟังก์ชันการตรวจสอบสิทธิ์ทั้งหมด มันถูกขยายจาก FR_Module และหน้าที่หลักของมันคือการกำหนดวิธีการทำงานของคลาสการตรวจสอบพื้นฐาน
เช่นเดียวกับ FR_Module บางคลาสไม่จำเป็นต้องเชื่อมต่อกับฐานข้อมูล ในทำนองเดียวกัน FR_Auth_No ก็สามารถสร้างและนำไปใช้กับคลาสที่ไม่ต้องการฟังก์ชันการรับรองความถูกต้องได้
<?php
คลาสนามธรรม FR_Auth ขยาย FR_Module
-
// {{{ __สร้าง()
ฟังก์ชั่น__สร้าง()
-
ผู้ปกครอง::__ สร้าง ();
-
-
// {{{ รับรองความถูกต้อง ()
ฟังก์ชั่นนามธรรมรับรองความถูกต้อง ();
// }}}
// {{{ __destruct()
ฟังก์ชั่น __destruct()
-
ผู้ปกครอง::__ ทำลาย ();
-
-
}
?>
module.php - หัวใจของโมดูลทั้งหมด
<?php
คลาสนามธรรม FR_Module ขยาย FR_Object_Web
-
// {{{ คุณสมบัติ
-
* $ผู้นำเสนอ
-
* ใช้ใน FR_Presenter::factory() เพื่อกำหนดการนำเสนอ (ดู)
* ควรใช้คลาสสำหรับโมดูล
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var string $presenter
* @ดู FR_Presenter, FR_Presenter_common, FR_Presenter_smarty
-
สาธารณะ $presenter = 'ฉลาด';
-
* $ข้อมูล
-
* ข้อมูลที่กำหนดโดยโมดูลที่จะส่งผ่านไปยังมุมมองในที่สุด
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var ผสม $data ข้อมูลโมดูล
* @ดู FR_Module::set(), FR_Module::getData()
*/
ป้องกัน $data = array();
/**
* $ชื่อ
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var string $name ชื่อของคลาสโมดูล
*/
ชื่อสาธารณะ $;
/**
* $tplFile
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var string $tplFile ชื่อของไฟล์เทมเพลต
* @ดู FR_Presenter_smarty
*/
สาธารณะ $tplFile;
/**
* $ชื่อโมดูล
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var string $moduleName ชื่อของโมดูลที่ร้องขอ
* @ดู FR_Presenter_smarty
*/
สาธารณะ $moduleName = null;
-
* $pageTemplateFile
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @var string $pageTemplateFile ชื่อของเทมเพลตหน้าภายนอก
*/
สาธารณะ $pageTemplateFile = null;
// }}}
// {{{ __construct()
-
* __สร้าง
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
*/
ฟังก์ชั่นสาธารณะ __construct()
-
ผู้ปกครอง::__ สร้าง ();
$this->name = $this->me->getName();
$this->tplFile = $this->name.'.tpl';
}
// }}}
// {{{ __ค่าเริ่มต้น()
/**
* __ค่าเริ่มต้น
-
* ฟังก์ชันนี้ทำงานโดยคอนโทรลเลอร์หากไม่มีการระบุเหตุการณ์
* ในคำขอของผู้ใช้
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
*/
ฟังก์ชั่นสาธารณะนามธรรม __default();
-
// {{{ set($var,$val)
/**
* ชุด
-
* ตั้งค่าข้อมูลสำหรับโมดูลของคุณในที่สุดสิ่งนี้จะถูกส่งต่อไปยัง
* คลาสผู้นำเสนอผ่าน FR_Module::getData()
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @param string $var ชื่อของตัวแปร
* @param ผสมค่า $val ของตัวแปร
* @return เป็นโมฆะ
* @ดู FR_Module::getData()
*/
ชุดฟังก์ชันที่ได้รับการป้องกัน($var,$val) {
$this->data[$var] = $val;
-
-
// {{{ getData()
/**
*getData
-
* ส่งคืนข้อมูลของโมดูล
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @return ผสม
* @ดู FR_Presenter_common
*/
ฟังก์ชั่นสาธารณะ getData()
-
ส่งคืน $this->data;
-
-
// {{{ isValid($โมดูล)
/**
*ถูกต้อง
-
* กำหนดว่า $module เป็นโมดูลกรอบงานที่ถูกต้องหรือไม่
* ตัวควบคุมเพื่อตรวจสอบว่าโมดูลเหมาะสมกับกรอบงานของเราหรือไม่
* mould ถ้ามันขยายจากทั้ง FR_Module และ FR_Auth ก็ควรจะเป็น
* วิ่งดี.
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @static
* @param ผสม $module
* @return บูล
*/
ฟังก์ชั่นคงที่สาธารณะ isValid ($ โมดูล)
-
กลับ (is_object($โมดูล) &&
$โมดูลอินสแตนซ์ของ FR_Module &&
$โมดูลอินสแตนซ์ของ FR_Auth);
-
-
// {{{ __destruct()
ฟังก์ชั่นสาธารณะ __destruct()
-
ผู้ปกครอง::__ ทำลาย ();
-
-
-
?>
Presenter.php - แกนหลักของเลเยอร์การนำเสนอ
<?php
คลาส FR_ผู้นำเสนอ
-
// {{{ โรงงาน($ประเภท,FR_Module $โมดูล)
-
*โรงงาน
-
* @ผู้เขียน โจ สตัมป์ < [email protected] ><
* @เข้าถึงสาธารณะ
* @param string $type ประเภทการนำเสนอ (มุมมองของเรา)
* @param ผสม $module โมดูลของเรา ซึ่งผู้นำเสนอจะแสดง
* @return ผสม PEAR_Error เมื่อเกิดความล้มเหลวหรือผู้นำเสนอที่ถูกต้อง
* @static
*/
โรงงานฟังก์ชั่นสาธารณะแบบคงที่ ($type, FR_Module $module)
-
$file = FR_BASE_PATH.'/includes/Presenter/'.$type.'.php';
ถ้า (รวม ($ ไฟล์)) {
$class = 'FR_Presenter_'.$type;
ถ้า (class_exists($class)) {
$presenter = $คลาสใหม่($โมดูล);
ถ้า ($ ผู้นำเสนออินสแตนซ์ของ FR_Presenter_common) {
ส่งคืน $ ผู้นำเสนอ;
-
return PEAR::raiseError('คลาสการนำเสนอไม่ถูกต้อง: '.$type);
-
return PEAR::raiseError('ไม่พบคลาสการนำเสนอ: '.$type);
-
return PEAR::raiseError('ไม่พบไฟล์ผู้นำเสนอ: '.$type);
-
-
}
?>
ในบทความถัดไป ผมจะแนะนำโครงสร้างของคอนโทรลเลอร์ (คอนโทรลเลอร์ใน MVC, index.php ในบทความนี้) ในบทความที่สาม ฉันจะแนะนำเลเยอร์การนำเสนอ (ดูใน MVC) ในบทความที่สี่ ฉันจะใช้โมดูลเฉพาะเป็นตัวอย่างในการสร้างแอปพลิเคชัน (โมดูลหรือโมเดลใน MVC)