Source code dành cho ai cần MVC đi phỏng vấn

2nd Nov 2022
Table of contents

Hướng dẫn từng bước set up một project PHP theo mô hình MVC. Bạn có thể sử dụng source này để tiết kiệm thời gian set up cho project của mình.

  • Buổi 1: Giới thiệu mô hình MVC https://www.youtube.com/watch?v=CasgqSBvOMY
  • Buổi 2: Controllers https://www.youtube.com/watch?v=JJ97y6OviRk
  • Buổi 3: Models https://www.youtube.com/watch?v=VCn6yu6eaFs
  • Buổi 4: Views https://www.youtube.com/watch?v=5JOgsWOS-CM
  • Buổi 5: Kết nối Database https://www.youtube.com/watch?v=guCJ0o2rUZ8
  • Buổi 6: Các vấn đề khác (Ajax, Route...) https://www.youtube.com/watch?v=TutBjMexFE4

Khóa học lập trình PHP tại Khoa Phạm: https://khoapham.vn/lap-trinh-php.html

Group học lập trình: https://www.facebook.com/groups/khoaphamonline

Website học lập trình online: http://online.khoapham.vn

Mô hình MVC là mô hình được sử dụng rất rộng rãi trong việc phát triển ứng dụng web ngày nay. Trong bài viết này, thông qua chương trình minh họa, mình sẽ giải thích mô hình MVC một cách đơn giản nhất để giúp các bạn có một cái nhìn dễ nhất về mô hình trên.

1. Giới thiệu

Mô hình MVC là mô hình gồm 3 lớp: ModelViewController. Cụ thể như sau:

  • Model: có trách nhiệm quản lí dữ liệu: giao tiếp với cơ sở dữ liệu, chịu trách nhiệm lưu trữ hoặc truy vấn dữ liệu.
  • View: là giao diện của ứng dụng, chịu trách nhiệm hiển thị dữ liệu của ứng dụng.
  • Controller: đóng vai trò quản lí và điều phối luồng hoạt động của ứng dụng. Controller sẽ nhận request từ client, điều phối các Model và View để có thể cho ra output thích hợp và trả kết quả về cho người dung.

Controller

Đây là nơi điều phối của ứng dụng: nhận request từ client, phân tích request, gọi Model để lấy data và View để tổ chức hiển thị data.

Trong ví dụ là chức năng quản lí học sinh được điều phối bởi controller C_Student.php. Có 2 chức năng con: Hiển thị danh sách học sinh(get list) và hiển thị thông tin học sinh(get detail information) nên controller sẽ phân biệt tính năng bằng cách kiểm tra tham số đầu vào là studentId. Tuỳ trường hợp mà controller sẽ gọi view tương ứng.

<?php
include_once("../Model/M_Student.php");

class  Ctrl_Student
{
	public function invoke(){
		if(isset($_GET['studentId']))
		{
			$modelStudent =  new Model_Student();
			$student = $modelStudent->getStudentDetail($_GET['studentId']);

			include_once("../View/StudentDetail.html");
		}
		else
		{
			$modelStudent =  new Model_Student();
			$studentList = $modelStudent->getAllStudent();

			include_once("../View/StudentList.html");
		}
	}
};

$C_Student = new Ctrl_Student();
$C_Student->invoke();

Model và Entity class

Nhiệm vụ chính của Model là thao tác với database để truy vấn dữ liệu. Các thao tác với database phải được đặt hết ở Model.

Ngoài ra tại Model còn chứa các Entity class(lớp thực thể ) là các lớp để mô tả đối tượng. Ở ví dụ, thư mục Model: Model_Student và Entity_Student.

Entity_Student chính là 1 thực thể mô tả về 1 student trong thực tế (tên, tuổi, trường…).

<?php

class Entity_Student
{
	public $id;
	public $name;
	public $age;
	public $university;

	public function __construct($_id, $_name, $_age, $_university)
	{
		$this->id = $_id;
		$this->name = $_name;
		$this->age = $_age;
		$this->university = $_university;
	}
}

?>

Model_Student sẽ sử dụng lớp thực thể này để cấu trúc dữ liệu sẽ lấy từ Database. Lớp Model_Student đóng vai trò giao tiếp với CSDL.

<?php
include_once("E_Student.php");

class Model_Student
{
	public function __construct()
	{}

	public function getAllStudent()
	{
		// Instance of load data from DB
		return array(
			"1" => new Entity_Student(1, "Nguyen Van A", 22, "University FPT"),
			"2" => new Entity_Student(2, "Tran Van B", 23, "University of Science"),
			"3" => new Entity_Student(3, "Pham Thi C", 21, "University of Technology"),
		);
	}

	public function getStudentDetail($studentId)
	{
		$allStudent = $this->getAllStudent();
		return $allStudent[$studentId];
	}
}

?>

View

View dùng để hiển thị dữ liệu lên cho người dùng, ta có 2 tính năng nhỏ là: danh sách học sinh và chi tiết học sinh tương ứng với 2 view khác nhau. Controller sẽ truyền các biến dữ liệu vào các View để chúng có thể hiển thị lên bằng cách nhúng mã PHP vào trong mã HTML.
Chúng ta có 2 view để thực hiện việc hiển thị dữ liệu là:

Danh sách học sinh tương ứng với StudentList.html

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8"/>
	<title>list</title>
</head>

<body>
	<h2>List:</h2>

	<?php

		for($i = 1; $i <= sizeof($studentList); $i++) {
			echo  "<p>" .$i .". <a href='?studentId=" .$studentList[$i]->id ."'>" .$studentList[$i]->name ."</a></p>";
		}

	?>

	<br>
	<p><a href="../index.php">Home page</a></p>
</body>
</html>

Chi tiết học sinh tương ứng với file StudentDetail.html

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8"/>
	<title>Student</title>
</head>

<body>
	<h2>Student:</h2>

	<?php

		echo  "<p><b>" .$student->name ."</b></p>";
		echo "<p> Age: " .$student->age .", School: " .$student->university .".</p><br>";

	?>

	<p><a href="javascript:history.back()">Back</a></p>

</body>
</html>

Việc nhúng mã PHP vào HTML khiến mã nguồn trở nên phức tạp và khó kiểm soát, việc này dẫn tới sự ra đời của các template engine như blade của Laravel hay twig... Các template engine tách biệt mã PHP ra khỏi mã HTML nên sẽ khiến code trở nên rõ ràng hơn nhiều.

Đối với các ứng dụng thuần AJAX, phần View có thể được triển khai bởi javascript, kéo theo việc sử dụng cấu trúc JSON.

Mô hình tuần tự sẽ giúp bạn hình dung luồng hoạt động của một http request trong mô hình MVC:

Kết nối với cơ sở dữ liệu trong laravel

 

Bạn thấy bài viết này như thế nào?
3 reactions
Attach

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Master list (in progress) of how to get parts of fields for use in Twig templates. I’m always having to look these up, so I thought I’d hash them out and write them down.

Litespeed Cache là plugin WordPress dùng để kết hợp với Web Server LiteSpeed nhằm tăng tốc website WordPress của bạn gấp nhiều lần

In this article, we are going to see how some tools & libraries will make people's lives easier during the development & code review process.

In this tutorial, you will learn how to improve the custom code, theme and module, and general code development by using the pre-commit hook on git

Trước khi tìm hiểu xem PHP Code Sniffer là gì thì các bạn cần phải nắm được coding convention là gì đã.