Ví dụ về mô hình MVC trong PHP

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: Model, View, Controller. 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.

Ta có thể mô tả lại hoạt động của mô hình MVC thông qua sơ đồ sau:

![](/content/images/2021/07/mvc_03.jpeg)

2. Chương trình minh hoạ

Ứng dụng minh hoạ có tính năng sau:

![](/content/images/2021/07/Screen-Shot-2021-07-14-at-22.52.17.png)

Tổ chức source code

Đầu tiên ta cần có 1 điểm truy cập ban đầu để vào được ứng dụng, file `index.php` đảm nhận nhiệm vụ này. File này ban đầu này sẽ có vai trò cho người dùng truy cập vào chức năng mong muốn(controller tương ứng), ở đây để đơn giản thì ta chỉ cài đặt 1 chức năng là `manage Student.`

Trong ví dụ tới này, mình sẽ tổ chức source code như hình dưới:

![](/content/images/2021/07/Screen-Shot-2021-07-14-at-22.57.06.png)

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 sinhchi 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:

3. Tổng kết

Mô hình MVC là mô hình thông dụng và tiện lợi hàng đầu trong việc phát triển ứng dụng web, trên đây mình đã trình bày cơ bản về mô hình MVC và cách thức của nó hoạt động. Trong các bài viết tiếp theo về hướng dẫn Laravel Framework, mình cũng sẽ đề cập lại mô hình MVC và các cấu trúc của nó. ([Link bài viết tiếp theo tham khảo tại đây.](http://))

Ngoài ra bạn cũng có thể tham khảo source code chương trình minh họa tại đây.