รูปแบบ MVC นั้นพบได้ทั่วไปในสถาปัตยกรรมเว็บไซต์ ช่วยให้เราสามารถสร้างแอปพลิเคชันสามระดับ โดยแยกเลเยอร์ที่มีประโยชน์ออกจากโค้ด ช่วยให้นักออกแบบและนักพัฒนาทำงานร่วมกัน และปรับปรุงความสามารถของเราในการรักษาและขยายแอปพลิเคชันที่มีอยู่
มุมมอง
"มุมมอง" ส่วนใหญ่หมายถึงผลลัพธ์สุดท้ายที่เราส่งไปยังเว็บเบราว์เซอร์ เช่น HTML ที่สร้างโดยสคริปต์ของเรา เมื่อพูดถึงมุมมอง หลายคนนึกถึงเทมเพลต แต่ความถูกต้องของการเรียกมุมมองโซลูชันเทมเพลตนั้นเป็นที่น่าสงสัย
สิ่งที่สำคัญที่สุดเกี่ยวกับมุมมองก็คือ ควร "ตระหนักรู้ในตนเอง" เมื่อมุมมองถูกเรนเดอร์ องค์ประกอบต่างๆ จะตระหนักถึงบทบาทของตนในกรอบงานที่กว้างขึ้น
ยกตัวอย่าง XML อาจกล่าวได้ว่าเมื่อมีการแยกวิเคราะห์ XML แล้ว DOM API จะมีความรู้ดังกล่าวจนโหนดในแผนผัง DOM รู้ว่าโหนดอยู่ที่ไหนและประกอบด้วยอะไรบ้าง (เมื่อโหนดในเอกสาร XML ถูกแยกวิเคราะห์ด้วย SAX มันจะเหมาะสมก็ต่อเมื่อมีการแยกวิเคราะห์โหนดเท่านั้น)
รูปแบบเทมเพลตส่วนใหญ่ใช้ภาษาขั้นตอนง่ายๆ และแท็กเทมเพลตเช่นนี้:
<p>{some_text}</p >
<p>{some_more_text}</p>
สิ่งเหล่านี้ไม่มีความหมายในเอกสาร ความหมายเพียงอย่างเดียวคือ PHP จะแทนที่มันด้วยสิ่งอื่น
หากคุณเห็นด้วยกับคำอธิบายแบบหลวมๆ ของมุมมอง คุณจะต้องยอมรับด้วยว่าโซลูชันเทมเพลตส่วนใหญ่ไม่สามารถแยกมุมมองและแบบจำลองได้อย่างมีประสิทธิภาพ แท็กเทมเพลตจะถูกแทนที่ด้วยสิ่งที่เก็บไว้ในโมเดล
ถามตัวเองสองสามข้อในขณะที่คุณใช้มุมมอง: "มันง่ายไหมที่จะแทนที่มุมมองทั้งหมด" "ใช้เวลานานเท่าใดในการใช้มุมมองใหม่" "มันง่ายที่จะแทนที่ภาษาคำอธิบายของมุมมองหรือไม่ (ตัวอย่างเช่น โดยใช้ SOAP ในมุมมองเดียวกัน Document จะแทนที่เอกสาร HTML)"
Model (Model)
โมเดลแสดงถึงตรรกะของโปรแกรม (มักเรียกว่าชั้นธุรกิจในโปรแกรมระดับองค์กร)
โดยทั่วไป งานของแบบจำลองคือการแปลงข้อมูลต้นฉบับให้เป็นข้อมูลที่มีความหมายบางอย่างซึ่งจะถูกแสดงโดยมุมมอง โดยทั่วไปแล้ว โมเดลจะสรุปการสืบค้นข้อมูล โดยอาจผ่านคลาสข้อมูลเชิงนามธรรม (ชั้นการเข้าถึงข้อมูล) เพื่อดำเนินการสืบค้น ตัวอย่างเช่น หากคุณต้องการคำนวณปริมาณน้ำฝนรายปีในสหราชอาณาจักร (เพียงเพื่อหาสถานที่พักผ่อนดีๆ ให้กับตัวเอง) แบบจำลองจะได้รับปริมาณน้ำฝนรายวันเป็นเวลาสิบปี คำนวณค่าเฉลี่ย แล้วส่งต่อไปยังมุมมอง
คอนโทรลเลอร์ (คอนโทรลเลอร์)
หมายความว่าคอนโทรลเลอร์เป็นส่วนแรกของคำขอ HTTP ขาเข้าในเว็บแอปพลิเคชัน จะตรวจสอบคำขอที่ได้รับ เช่น ตัวแปร GET บางตัว และให้ข้อเสนอแนะที่เหมาะสม เป็นเรื่องยากที่จะเริ่มเขียนโค้ด PHP อื่นจนกว่าคุณจะเขียนคอนโทรลเลอร์ตัวแรก การใช้งานที่พบบ่อยที่สุดคือโครงสร้างเช่นคำสั่ง switch ใน index.php:
<?php
สลับ ($_GET ['หน้าดู']) {
กรณี "ข่าว":
$page=New NewsRenderer;
หยุดพัก;
กรณี "ลิงก์":
$page=ลิงก์ใหม่ LinksRenderer;
หยุดพัก;
ค่าเริ่มต้น:
$page=new HomePageRenderer;
หยุดพัก;
-
$หน้า->จอแสดงผล();
?>
โค้ดนี้เป็นการผสมผสานระหว่างโค้ดเชิงขั้นตอนและโค้ดเชิงวัตถุ แต่สำหรับไซต์ขนาดเล็ก โดยปกติแล้วจะเป็นตัวเลือกที่ดีที่สุด แม้ว่าโค้ดด้านบนจะยังคงสามารถปรับให้เหมาะสมได้
จริงๆ แล้วตัวควบคุมคือส่วนควบคุมที่ใช้เพื่อทริกเกอร์การเชื่อมโยงระหว่างข้อมูลของโมเดลและองค์ประกอบมุมมอง
ตัวอย่าง
นี่คือตัวอย่างง่ายๆ โดยใช้รูปแบบ MVC
ก่อนอื่นเราจำเป็นต้องมีคลาสการเข้าถึงฐานข้อมูลซึ่งเป็นคลาสธรรมดา
<?php
-
* คลาสง่าย ๆ สำหรับการสืบค้น MySQL
-
คลาส DataAccess {
-
*ส่วนตัว
* $db เก็บทรัพยากรฐานข้อมูล
-
var $db;
-
*ส่วนตัว
* $query เก็บทรัพยากรการสืบค้น
-
var $query; // สืบค้นทรัพยากร
//!
-
* สร้างวัตถุ DataAccess ใหม่
* @param $host ชื่อโฮสต์สตริงสำหรับ dbserver
* @param $user สตริงผู้ใช้ dbserver
* @param $pass string รหัสผ่านผู้ใช้ dbserver
* ชื่อฐานข้อมูลสตริง @param $db
-
ฟังก์ชั่น DataAccess ($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$this->db);
}
//!
-
* ดึงทรัพยากรแบบสอบถามและเก็บไว้ในสมาชิกท้องถิ่น
* @param $sql สตริงการสืบค้นฐานข้อมูลเพื่อรัน
* @return เป็นโมฆะ
-
ฟังก์ชั่นดึงข้อมูล ($ sql) {
$this->query=mysql_unbuffered_query($sql,$this->db); // ดำเนินการค้นหาที่นี่
}
//!
-
* ส่งกลับอาร์เรย์ที่เชื่อมโยงของแถวแบบสอบถาม
* @return ผสม
-
ฟังก์ชั่น getRow () {
ถ้า ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
กลับ $แถว;
อื่น
กลับเท็จ;
-
-
?>
วางโมเดลไว้ด้านบน
<?php
-
* ดึง "ผลิตภัณฑ์" จากฐานข้อมูล
-
คลาส ProductModel {
-
*ส่วนตัว
* $dao อินสแตนซ์ของคลาส DataAccess
-
var $dao;
//!
-
* สร้างวัตถุ ProductModel ใหม่
* @param $dbobject อินสแตนซ์ของคลาส DataAccess
-
ฟังก์ชั่น ProductModel (&$dao) {
$นี่->ดาว=& $ดาว;
}
//! นักบงการ
-
* บอกให้ $dboject เก็บแบบสอบถามนี้เป็นทรัพยากร
* @param $start แถวที่จะเริ่มต้น
* @param $row คือจำนวนแถวที่จะดึงข้อมูล
* @return เป็นโมฆะ
-
ฟังก์ชั่น listProducts($start=1,$rows=50) {
$this->dao->fetch("SELECT * จากผลิตภัณฑ์จำกัด ".$start", ".$rows);
}
//! นักบงการ
-
* บอกให้ $dboject เก็บแบบสอบถามนี้เป็นทรัพยากร
* @param $id เป็นคีย์หลักสำหรับแถว
* @return เป็นโมฆะ
-
รายการฟังก์ชันผลิตภัณฑ์($id) {
$this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
}
//! นักบงการ
-
* ดึงข้อมูลผลิตภัณฑ์เป็นอาร์เรย์ที่เชื่อมโยงจาก $dbobject
* @return ผสม
-
ฟังก์ชั่นgetProduct() {
ถ้า ( $product=$this->dao->getRow() )
ส่งคืนสินค้า $;
อื่น
กลับเท็จ;
-
-
?>
สิ่งหนึ่งที่ควรทราบก็คือปฏิสัมพันธ์ระหว่างโมเดลและคลาสการเข้าถึงข้อมูลจะต้องไม่เกินหนึ่งบรรทัด - ไม่มีการส่งหลายบรรทัดซึ่งจะทำให้โปรแกรมช้าลงอย่างรวดเร็ว โปรแกรมเดียวกันนี้จำเป็นต้องเก็บเพียงหนึ่งแถว (แถว) ในหน่วยความจำสำหรับคลาสที่ใช้สคีมา - ส่วนที่เหลือจะมอบให้กับทรัพยากรการสืบค้นที่บันทึกไว้ (ทรัพยากรการสืบค้น) - กล่าวอีกนัยหนึ่งคือ เราปล่อยให้ MYSQL ดูแลรักษาผลลัพธ์ให้เรา
ต่อไปคือมุมมอง - ฉันลบ HTML ออกเพื่อประหยัดพื้นที่ คุณสามารถดูโค้ดเต็มได้ในโพสต์นี้
<?php
-
* เชื่อมโยงข้อมูลผลิตภัณฑ์กับการแสดงผล HTML
-
คลาส ProductView {
-
*ส่วนตัว
* $model อินสแตนซ์ของคลาส ProductModel
-
var $model;
/**
*ส่วนตัว
* HTML ที่แสดงผล $output ถูกเก็บไว้ที่นี่เพื่อแสดง
-
var $output;
//!
-
* สร้างวัตถุ ProductView ใหม่
* @param $model อินสแตนซ์ของคลาส ProductModel
-
ฟังก์ชั่น ProductView (&$ รุ่น) {
$นี่->รุ่น=& $รุ่น;
}
//! นักบงการ
-
* สร้างส่วนบนสุดของหน้า HTML
* @return เป็นโมฆะ
-
ส่วนหัวของฟังก์ชัน () {
}
//!
-
* สร้างด้านล่างของหน้า HTML
* @return เป็นโมฆะ
-
ส่วนท้ายของฟังก์ชัน () {
}
//!
-
* แสดงสินค้ารายการเดียว
* @return เป็นโมฆะ
-
ฟังก์ชั่น productItem($id=1) {
$this->model->listProduct($id);
ในขณะที่ ( $product=$this->model->getProduct() ) {
// ผูกข้อมูลเข้ากับ HTML
-
}
//! นักบงการ
-
* สร้างตารางผลิตภัณฑ์
* @return เป็นโมฆะ
-
ฟังก์ชั่น productTable($rownum=1) {
$rowsperpage='20';
$this->model->listProducts($rownum,$rowsperpage);
ในขณะที่ ( $product=$this->model->getProduct() ) {
// ผูกข้อมูลเข้ากับ HTML
-
}
//!
-
* ส่งกลับ HTML ที่แสดงผล
* สตริง @return
-
แสดงฟังก์ชัน () {
ส่งคืน $this->output;
-
-
?
สรุป: รูปแบบ MVC เป็นเรื่องธรรมดามากในสถาปัตยกรรมเว็บไซต์ ช่วยให้เราสามารถสร้างแอปพลิเคชันสามระดับ โดยแยกเลเยอร์ที่มีประโยชน์ออกจากโค้ด ช่วยให้นักออกแบบและนักพัฒนาทำงานร่วมกัน และปรับปรุงความสามารถของเราในการรักษาและขยายแอปพลิเคชันที่มีอยู่ บทความนี้จะแนะนำให้คุณรู้จักกับการใช้งานรูปแบบ MVC ใน PHP
แท็ก: PHP MVC รูปแบบ MVC เว็บไซต์ PHP
Oracle ช่วยให้คุณได้รับข้อมูลเชิงลึกที่แม่นยำเกี่ยวกับลิงก์ลอจิสติกส์แต่ละอัน
Oracle ช่วยให้คุณได้รับข้อมูลเชิงลึกที่แม่นยำเกี่ยวกับแต่ละลิงก์ด้านลอจิสติกส์ สุดท้ายนี้ ตัวควบคุม เราจะนำมุมมองไปใช้ในฐานะคลาสย่อย
<?php
-
* ควบคุมการใช้งาน
-
คลาส ProductController ขยาย ProductView {
//!
-
* สร้างวัตถุ ProductController ใหม่
* @param $model อินสแตนซ์ของคลาส ProductModel
* @param $getvars ตัวแปรเมธอด HTTP GET ขาเข้า
-
ฟังก์ชั่น ProductController (&$model,$getvars=null) {
ProductView::ProductView($รุ่น);
$นี่->ส่วนหัว();
สวิตช์ ( $getvars['view'] ) {
กรณี "ผลิตภัณฑ์":
$this->productItem($getvars['id']);
หยุดพัก;
ค่าเริ่มต้น:
ถ้า ( ว่างเปล่า ($getvars['rownum']) ) {
$นี่->productTable();
} อื่น {
$this->productTable($getvars['rownum']);
-
หยุดพัก;
-
$นี่->ส่วนท้าย();
-
-
?
โปรดทราบว่านี่ไม่ใช่วิธีเดียวที่จะนำ MVC ไปใช้ ตัวอย่างเช่น คุณสามารถใช้คอนโทรลเลอร์เพื่อนำโมเดลไปใช้และรวมมุมมองไปพร้อมๆ กัน นี่เป็นเพียงวิธีหนึ่งในการสาธิตรูปแบบ
ไฟล์ index.php ของเรามีลักษณะดังนี้:
<?php
need_once('lib/DataAccess.php');
need_once('lib/ProductModel.php');
need_once('lib/ProductView.php');
need_once('lib/ProductController.php');
$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& ProductModel ใหม่($dao);
$productController=& ตัวควบคุมผลิตภัณฑ์ใหม่($productModel,$_GET);
echo $productController->จอแสดงผล();
?>
สวยงามและเรียบง่าย
เรามีเคล็ดลับในการใช้คอนโทรลเลอร์ ใน PHP คุณสามารถทำได้:
$this->{$_GET['method']}($_GET['param']);
ข้อเสนอแนะประการหนึ่งคือคุณควรกำหนดแบบฟอร์ม URL Namespace ของโปรแกรมให้ดีขึ้น (เนมสเปซ) จากนั้นจะมีมาตรฐานมากขึ้น เช่น:
"index.php?class=ProductView&method=productItem&id=4"
เราสามารถประมวลผลคอนโทรลเลอร์ของเราเช่นนี้:
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
บางครั้ง การสร้างคอนโทรลเลอร์ก็ทำได้ยาก เช่น เมื่อคุณต้องแลกกับความเร็วในการพัฒนาและความสามารถในการปรับตัว สถานที่ที่ดีในการรับแรงบันดาลใจคือ Java Struts ของกลุ่ม Apache ซึ่งตัวควบคุมถูกกำหนดโดยเอกสาร XML ทั้งหมด