บทช่วยสอนกรอบ PHP MVC
⚡ สรุปอย่างชาญฉลาด
การออกแบบเฟรมเวิร์ก PHP MVC แยกข้อมูลแอปพลิเคชันและตรรกะทางธุรกิจออกจากส่วนนำเสนอ โดยใช้โมเดล วิว และคอนโทรลเลอร์ CodeIgniter ทำให้รูปแบบนี้ใช้งานได้จริง ช่วยให้นักพัฒนา PHP สร้างเว็บแอปพลิเคชันที่ปลอดภัยและดูแลรักษาง่ายได้เร็วขึ้น
กรอบงาน PHP MVC คืออะไร?
PHP MVC เป็นรูปแบบการออกแบบแอปพลิเคชันที่แยกข้อมูลแอปพลิเคชันและตรรกะทางธุรกิจ (โมเดล) ออกจากการนำเสนอ (มุมมอง) MVC ย่อมาจาก Model, View & Controller
ตัวควบคุมจะทำหน้าที่เป็นสื่อกลางระหว่างโมเดลและมุมมอง
คิดว่ารูปแบบการออกแบบ MVC เป็นรถยนต์และเป็นคนขับ
รถยนต์มีกระจกหน้ารถ (สำหรับการมองเห็น) ซึ่งคนขับ (ผู้ควบคุม) ใช้ในการตรวจสอบสภาพการจราจรข้างหน้า จากนั้นจึงเร่งความเร็วหรือเบรก (ตามแบบจำลอง) ขึ้นอยู่กับสิ่งที่เขาเห็นข้างหน้า
ต่อไป เรามาดูกันว่าทำไมเฟรมเวิร์กที่สร้างขึ้นบนรูปแบบนี้จึงคุ้มค่าแก่การใช้งาน
เหตุใดจึงต้องใช้ PHP MVC Framework?
เฟรมเวิร์ก PHP MVC ช่วยให้การทำงานกับเทคโนโลยีที่ซับซ้อนง่ายขึ้นโดย:
- ซ่อนรายละเอียดการใช้งานที่ซับซ้อนทั้งหมด
- จัดเตรียมวิธีการมาตรฐานที่เราสามารถใช้ในการสร้างแอปพลิเคชันของเรา
- ช่วยเพิ่มประสิทธิภาพการทำงานของนักพัฒนา เนื่องจากฟังก์ชันพื้นฐานต่างๆ เช่น การเชื่อมต่อกับฐานข้อมูลและการตรวจสอบความถูกต้องของข้อมูลที่ผู้ใช้ป้อนเข้ามา ได้ถูกพัฒนาไว้แล้วบางส่วน
- ส่งเสริมการปฏิบัติตามมาตรฐานการเขียนโค้ดอย่างมืออาชีพ
รูปแบบการออกแบบ PHP MVC
ตอนนี้เรามาพูดคุยกันสั้น ๆ เกี่ยวกับแต่ละองค์ประกอบของรูปแบบการออกแบบ MVC
รุ่น – ส่วนนี้เกี่ยวข้องกับตรรกะทางธุรกิจและข้อมูลแอปพลิเคชัน สามารถใช้ในการตรวจสอบข้อมูล ประมวลผลข้อมูล และจัดเก็บข้อมูลได้ ข้อมูลสามารถมาจาก;
- ไฟล์แบน
- ฐานข้อมูล
- เอกสาร XML
- แหล่งข้อมูลที่ถูกต้องอื่นๆ
ตัวควบคุม – ส่วนนี้เป็นส่วนที่จัดการคำขอของผู้ใช้ในการขอทรัพยากรจากเซิร์ฟเวอร์
ตัวอย่างเช่น เมื่อผู้ใช้ร้องขอ URL …/index.php?products=listตัวควบคุมจะโหลดโมเดลผลิตภัณฑ์เพื่อดึงข้อมูลผลิตภัณฑ์ จากนั้นแสดงผลลัพธ์ในมุมมองรายการ
โดยสรุป คอนโทรลเลอร์จะเชื่อมโยงโมเดลและมุมมองเข้าด้วยกัน ขึ้นอยู่กับทรัพยากรที่ร้องขอ
เข้าชม – ส่วนนี้เกี่ยวกับการนำเสนอข้อมูลแก่ผู้ใช้ ซึ่งโดยปกติจะอยู่ในรูปแบบของหน้าเว็บ HTML
ประเภทของเฟรมเวิร์ก PHP MVC
การเลือกเฟรมเวิร์ก PHP ที่ดีที่สุดถือเป็นความท้าทาย
คุณไม่จำเป็นต้องเขียนเฟรมเวิร์กของคุณเองเพื่อรับประโยชน์จากข้อดีของ MVC
คุณควรพยายามสร้างการออกแบบแอปพลิเคชันที่เกี่ยวข้องกับ MVC ของคุณเองเพื่อทำความเข้าใจวิธีการทำงานของกรอบงาน MVC
เมื่อคุณพอใจกับวิธีการทำงานของกรอบงาน MVC แล้ว คุณควรก้าวไปสู่กรอบงานที่สมบูรณ์และผ่านการทดสอบแล้ว
ตารางด้านล่างนี้อธิบายโดยย่อเกี่ยวกับเฟรมเวิร์ก PHP ยอดนิยมบางส่วนและคุณสมบัติที่แต่ละเฟรมเวิร์กนำเสนอ
| กรอบ | Descriptไอออน |
|---|---|
|
|
เป็นหนึ่งในเฟรมเวิร์ก PHP MVC ที่ได้รับความนิยมมากที่สุด ปัจจุบันอยู่ในเวอร์ชันหลักที่สี่แล้ว (CodeIgniter 4) เป็นไลบรารีที่มีน้ำหนักเบาและเรียนรู้ได้เร็ว มีไลบรารีมากมายที่ช่วยสร้างเว็บไซต์และแอปพลิเคชันได้อย่างรวดเร็ว ผู้ใช้ที่มีความรู้ด้านการเขียนโปรแกรมเชิงวัตถุ (OOP) จำกัดก็สามารถใช้งานได้ แอปพลิเคชันที่สร้างด้วย Igniter 4 นั้นมีประสิทธิภาพสูง Codeส่วนประกอบที่จุดประกายไฟ ได้แก่;
|
|
เป็นเฟรมเวิร์กแบบ Hierarchical Model View Controller (HMVC) ที่ปลอดภัยและมีน้ำหนักเบา หมายเหตุ Kohana ถูกยุติการพัฒนาอย่างเป็นทางการในปี 2017 โดยเวอร์ชันเสถียรสุดท้ายคือ 3.3.6 (กรกฎาคม 2016) ส่วน Koseven ซึ่งเป็นเวอร์ชันที่พัฒนาต่อยอดจาก Kohana นั้นยังคงใช้โค้ดเบสเดิมอยู่ บริษัทที่เคยใช้ Kohana ได้แก่; |
|
มันถูกสร้างขึ้นโดยอิงตาม Ruby on Rails และยังคงได้รับการดูแลรักษาอย่างต่อเนื่อง (เวอร์ชัน 5.x) เป็นที่รู้จักในด้านแนวคิดต่างๆ เช่น รูปแบบการออกแบบซอฟต์แวร์, การใช้ข้อตกลงแทนการกำหนดค่า, ActiveRecord เป็นต้น CakePHP แอพพลิเคชั่นที่ขับเคลื่อนได้แก่; |
|
|
มันเป็นกรอบการทำงานที่ทรงพลังนั่นคือ
เหมาะอย่างยิ่งสำหรับการพัฒนาping แอปพลิเคชันทางธุรกิจ ในปี 2020 Zend Framework ได้เปลี่ยนไปใช้ Laminas Project ซึ่งเป็นโอเพนซอร์ส แอปพลิเคชันที่ใช้ Zend/Laminas ได้แก่:
บริษัทต่างๆ ที่ใช้กรอบการทำงาน Zend ได้แก่:
|
เฟรมเวิร์ก PHP MVC เทียบกับ PHP ธรรมดา: ความแตกต่างที่สำคัญ
เฟรมเวิร์กเปลี่ยนแปลงอะไรในทางปฏิบัติบ้าง? PHP แบบธรรมดาให้คุณมีอิสระอย่างเต็มที่ แต่สุดท้ายแล้วทุกโปรเจ็กต์ก็ต้องสร้างระบบการกำหนดเส้นทาง การตรวจสอบความถูกต้อง และการเข้าถึงฐานข้อมูลขึ้นมาใหม่ทั้งหมด เฟรมเวิร์ก PHP MVC จะทำให้งานที่ซ้ำซากเหล่านี้เป็นมาตรฐาน ทำให้โค้ดของคุณมีความสม่ำเสมอในทุกโปรเจ็กต์และทุกทีม
| แง่มุม | PHP ธรรมดา | เฟรมเวิร์ก PHP MVC |
|---|---|---|
| Code organizacja | การผสมผสาน HTML, SQL และตรรกะไว้ในไฟล์เดียว | แบ่งออกเป็นโมเดล มุมมอง และตัวควบคุม |
| การเข้าถึงฐานข้อมูล | คำถามที่เขียนด้วยลายมือในทุกหน้า | ตัวสร้างแบบสอบถามในตัวหรือ ORM ที่มีการผูกพารามิเตอร์ |
| ความปลอดภัย | นักพัฒนาต้องไม่ลืมมาตรการป้องกันทุกอย่าง | รวมถึงการกรองข้อมูลขาเข้า การป้องกัน XSS และ CSRF |
| ซ่อมบำรุง | การเปลี่ยนแปลงต่างๆ ส่งผลกระทบต่อไฟล์ต่างๆ อย่างคาดเดาไม่ได้ | แต่ละชั้นสามารถเปลี่ยนแปลงได้อย่างอิสระ |
💡 เคล็ดลับ: สร้างโปรเจ็กต์ PHP ขนาดเล็กธรรมดาๆ ขึ้นมาก่อน เช่นแบบสำรวจความคิดเห็นด้านล่าง ความยุ่งยากของการเขียนโค้ดแบบผสมจะทำให้เห็นคุณค่าของการแยกส่วน MVC อย่างชัดเจน
การย้ายแอปพลิเคชันสำรวจความคิดเห็นไปยัง Codeเครื่องทำให้ลุกไหม้
ในการนี้ เกี่ยวกับการสอนเราได้สร้างแอปพลิเคชันโพลล์ด้วย PHP และต่อไปนี้เราจะแปลงโค้ดนั้นไปใช้กับ... Codeเครื่องทำให้ลุกไหม้
- ดาวน์โหลด รุ่นล่าสุดของ Codeจุดประกายจากพวกเขา เว็บไซต์.
- Extracคัดลอกเนื้อหาของไฟล์ซิปไปยังไดเร็กทอรีการพัฒนาของคุณในไดเร็กทอรีเว็บเซิร์ฟเวอร์ ในบทเรียนนี้เราจะใช้ชื่อโฟลเดอร์ว่า ciopinionpoll
- เรียกดูไฟล์ URL http://localhost/ciopinionpoll/
การขอ Codeหน้าต้อนรับของ Igniter ด้านบนยืนยันว่าเฟรมเวิร์กได้รับการติดตั้งอย่างถูกต้องแล้ว ตอนนี้เราจะทำการย้ายแอปพลิเคชันแบบสำรวจความคิดเห็นของเราไปยัง Igniter Codeตัวจุดประกาย โปรดจำไว้ว่าแอปพลิเคชันของเราแบ่งออกเป็นสามส่วนหลัก ได้แก่;
- ตัวควบคุมด้านหน้า – นี่คือส่วนที่ตอบสนองต่อ URL ส่งคำขอและส่งคืนหน้าเว็บที่ร้องขอ โค้ดนี้จะอยู่ในคอนโทรลเลอร์
- โมเดล – นี่คือโค้ดที่ตอบสนองต่อคำขอข้อมูลและส่งคืนข้อมูลที่ร้องขอ โค้ดนี้จะอยู่ในส่วนของโมเดล
- มุมมอง – นี่คือโค้ดที่รับผิดชอบในการจัดรูปแบบและการแสดงข้อมูล รหัสนี้จะเข้าสู่มุมมอง
การตั้งค่าการกำหนดค่าฐานข้อมูล
วิธีการตั้งค่าการเชื่อมต่อฐานข้อมูล:
- เข้าไปที่โฟลเดอร์ ciopinionpoll
- เปิด ฐานข้อมูล.php ไฟล์ดังกล่าวอยู่ในไดเร็กทอรี application/config
- ค้นหาบรรทัดโค้ดต่อไปนี้
- ตั้งชื่อผู้ใช้เป็นรูท
- ตั้งรหัสผ่านเป็นรหัสผ่าน root ของ localhost ของคุณ
- ตั้งชื่อฐานข้อมูลเป็น opinion_poll โปรดทราบว่าเราจะใช้ฐานข้อมูลที่สร้างไว้ในบทเรียนก่อนหน้านี้
- บันทึกการเปลี่ยนแปลงและปิดไฟล์
การสร้างแบบจำลองของเรา
ต่อไปเราจะสร้างโมเดลของเราที่จะขยายโมเดล CI_Model CI_Model เป็นส่วนหนึ่งของ... Codeไลบรารี Igniter โมเดลจะอยู่ในโฟลเดอร์ application/models comment_poll_model.php
<?php
class Opinion_poll_model extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->load->database();
}
public function total_votes()
{
$query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
return $query->row()->choices_count;
}
public function get_results()
{
$libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
$table_rows = '';
for ($i = 1; $i < 5; $i++)
{
$query = $this->db->select('COUNT(choice) as choices_count')
->where('choice', $i)
->get('js_libraries');
$table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
}
return $table_rows;
}
public function add_vote($choice)
{
$ts = date("Y-m-d H:i:s");
$data = array('choice' => $choice, 'ts' => $ts);
$this->db->insert('js_libraries', $data);
}
}
?>
ที่นี่
- “class Opinion_poll_model ขยาย CI_Model…” เป็นโมเดลของเราที่ขยาย CI_Model
- “parent::__construct();” เรียกใช้คอนสตรัคเตอร์ของ CI_Model
- “$นี่->โหลด->ฐานข้อมูล();” โหลดไลบรารีฐานข้อมูลเพื่อให้แอปพลิเคชันของเราสามารถโต้ตอบกับฐานข้อมูลได้
- “$this->db->” คือ Codeประวัติการทำงานของ Igniter ตรวจสอบได้ที่นี่ ลิงค์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับบันทึกที่ใช้งานอยู่
การสร้างคอนโทรลเลอร์ของเรา
ตอนนี้เรามาสร้างคอนโทรลเลอร์กัน เราจะใช้ค่าเริ่มต้น Codeตัวควบคุม Igniter อยู่ในไฟล์ application/controllers/welcome.php แทนที่โค้ดต้นฉบับด้วยโค้ดต่อไปนี้
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('opinion_poll_model');
}
public function index() {
if ($this->input->post('submitbutton') && !$this->input->post('vote')) {
echo "<script>alert('You did not vote!');</script>";
}
if ($this->input->post('vote')) {
$this->opinion_poll_model->add_vote($this->input->post('vote'));
$data['total_votes'] = $this->opinion_poll_model->total_votes();
$data['rows'] = $this->opinion_poll_model->get_results();
$this->load->view('results', $data);
} else {
$this->load->view('opinion_poll_form');
}
}
}
/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */
?>
ที่นี่
- “ถ้า (!กำหนด('BASEPATH')) exit('ไม่อนุญาตให้เข้าถึงสคริปต์โดยตรง');” ตรวจสอบให้แน่ใจว่าผู้ใช้ไม่ได้เข้าถึงคลาสคอนโทรลเลอร์โดยตรง
- “ยินดีต้อนรับคลาสขยาย CI_Controller…” คอนโทรลเลอร์ของเราขยายคลาส CI_Controller
- “public function __construct()” เรียกเมธอด constructor ของคลาส CI_Controller และโหลดโมเดล Opinion_poll_model ของเรา
- “public function index()…” คือฟังก์ชันที่เชื่อมโยงกับไฟล์ index.php โดยใช้ Codeคลาส input ของ Igniter ใช้สำหรับตรวจสอบว่ามีการส่งคะแนนโหวตแล้วหรือไม่ หากใช่ จะเพิ่มข้อมูลลงในฐานข้อมูล จากนั้นจึงแสดงผลลัพธ์ ถ้าอาร์เรย์ post ของคลาส input ว่างเปล่า ระบบจะโหลดหน้าโหวต
- “$this->input->post('…')” คือ Codeคลาสอินพุตของ Igniter ที่ดึงค่าจากตัวแปรส่วนกลาง $_POST
- “$this->opinion_poll_model->add_vote($this->input->post('vote'))” เรียกเมธอด add_vote ของโมเดลเพื่อเพิ่มการโหวตลงในฐานข้อมูล
การสร้างมุมมองของเรา
จากตัวอย่างก่อนหน้านี้ เราได้สร้างหน้า HTML สองหน้า หน้าหนึ่งสำหรับลงคะแนน และอีกหน้าหนึ่งสำหรับแสดงผลลัพธ์ เราจะใช้โค้ด HTML เดียวกันนี้ โดยมีการแก้ไขเพียงเล็กน้อย เพื่อสร้างหน้าแสดงผล (views) สร้างไฟล์ต่อไปนี้ในไดเร็กทอรี application/views
opinion_poll_form.php
<html>
<head>
<title>
JavaScript Libraries - Opinion Poll
</title>
</head>
<body>
<h2>JavaScript Libraries - Opinion Poll</h2>
<p><b>What is your favorite JavaScript Library?</b></p>
<form method="POST" action="index.php">
<p>
<input type="radio" name="vote" value="1" /> JQuery
<br />
<input type="radio" name="vote" value="2" /> MooTools
<br />
<input type="radio" name="vote" value="3" /> YUI Library
<br />
<input type="radio" name="vote" value="4" /> Glow </p>
<p>
<input type="submit" name="submitbutton" value="OK" />
</p>
</form>
</body>
</html>
ตอนนี้เรามาสร้างหน้าผลลัพธ์ results.php กันดีกว่า
<html>
<head>
<title>JavaScript Libraries - Opinion Poll Results</title>
</head>
<body>
<h2>JavaScript Libraries - Opinion Poll Results</h2>
<p><b>What is your favorite JavaScript Library?</b></p>
<p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>
<p><table><tr><td>
<?php print($rows); ?>
</tr></td></table></p>
<p><a href="#">Return to voting page</a></p>
</body>
</html>
การทดสอบแอปพลิเคชันของเรา
สมมติว่าไดเร็กทอรีหลักของแอปพลิเคชันของคุณคือ ciopinionpoll ให้เข้าไปที่ http://localhost/ciopinionpoll/
หน้าลงคะแนนด้านบนมาจากมุมมอง opinion_poll_form ของเรา คลิกตกลงโดยไม่ต้องเลือกตัวเลือกใดๆ แล้วคุณจะเห็นข้อความแจ้งเตือนต่อไปนี้
โหวตให้ห้องสมุดที่คุณชื่นชอบ จากนั้นคลิก ตกลง คุณจะเห็นหน้าผลลัพธ์ดังต่อไปนี้
สิ่งนี้ยืนยันว่าทั้งสามส่วนทำงานร่วมกัน: ตัวควบคุมรับคะแนนโหวต โมเดลจัดเก็บและนับคะแนน และส่วนแสดงผลแสดงผลรวม









