Mô hình
MVC (model, controller, view) là mô hình chuẩn cho ứng dụng web được sử dụng nhiều nhất ngày nay. Mô hình
MVC
được sử dụng lần đầu tiên trong Smalltalk, sau đó được sử dụng phổ biến
trong ngôn ngữ lập trình Java. Hiện nay, đã có hơn hàng chục PHP
framework dựa trên mô hình này.
Bạn biết đấy, mô hình MVC hiện nay rất phổ biến trong các framework PHP,
nhưng thực sự rất khó để tìm một bài viết với hướng dẫn chi tiết kèm
theo những ví dụ đơn giản để chúng ta có thể hiểu được về nó. Đó là mục
đích của hướng dẫn này
Mô hình MVC là viết tắt của 3 chữ
Model,
View,
Controller. Mô hình này tách một ứng dụng web ra làm 3 thành phần đảm nhiệm chức năng tách biệt, thuận tiện cho việc xử lý và bảo trì
Model : Chịu trách nhiệm quản lý dữ liệu, nó lưu trữ và
truy xuất các thực thể từ cơ sở dữ liệu như mysql, sql server,
postresSQL,… đồng thời chưa các logic được thực thi bởi ứng dụng
View : Chịu trách nhiệm hiển thị dữ liệu đã được truy
xuất từ model theo một format nào đó theo ý đồ của lập trình viên. Cách
sử dụng của View tương tự như các module templates thường thấy trong các
ứng dụng web phổ biến như WordPress, Joomla,…
Controller : trung gian, làm nhiệm vụ xử lý cho model
và view tương tác với nhau. Controller nhận request từ client, sau đó
gọi các model để thực hiện các hoạt động được yêu cầu và gửi ra ngoài
View. View sẽ chịu trách nhiệm format lại data từ controller gửi ra và
trình bày dữ liệu theo 1 định dạng đầu ra (html).
Hình minh họa dưới đây sẽ cho bạn thấy rõ cách mô hình MVC hoạt động
2. Từng bước thực hành ví dụ về mô hình MVC
Đầu tiên, trong thư mục gốc của website ở local (với wamp thì là www,
với xampp thì là htdocs), bạn tạo một folder đặt tên là mvc với cấu
trúc thư mục như sau :
a. Controller
Đầu tiên chúng ta sẽ làm việc với controller, đây là nơi đầu tiền
nhận các yêu cầu (requests), phân tích yêu cầu, khởi tạo và gọi model,
sau đó nhận các hồi đáp (response) từ model và gửi ra các lớp giao diện
(view). Trong thực tế Controller được gọi từ điểm đầu vào của ứng dụng
là tập tin index.php. Tập tin này sẽ giao toàn bộ các yêu cầu gửi từ
client cho controller xử lý.
Trong tập tin index.php ta thêm gõ đoạn code sau:
|
// index.php file
include_once("controller/Controller.php");
$controller = new Controller();
$controller->invoke();
|
Trong tập tin Controller.php của chúng ta sẽ tạo ra 1 function là
invoke và một hàm khởi tạo contructor. Hàm contructor chịu trách nhiệm
gọi và khởi tạo lớp Model. Trong hàm invoke sẽ quyết định data nào được
phép trả ra từ model. Sau đó nó gọi model để lấy dữ liệu cần thiết, sau
đó gửi dữ liệu ra view. Đoạn code cực kỳ đơn giản bên dưới sẽ cho bạn
thấy điều đó. Lưu ý rằng, Controller không biết gì về cấu trúc database
như thế nào cũng như là data gửi ra ngoài view sẽ có hình thù như thế
nào bạn nhé. Nó chỉ có nhiệm vụ gọi model bởi request từ client và gửi
dữ liệu ra ngoài view thôi nhé
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
include_once("model/Model.php");
class Controller {
public $model;
public function __construct()
{
$this->model = new Model();
}
public function invoke()
{
if (!isset($_GET['book']))
{
// nếu không có quyển sách nào được yêu cầu, thì hiển thị toàn bộ sách
$books = $this->model->getBookList();
include 'view/booklist.php';
}
else
{
// hiên thị sách được yêu cầu
$book = $this->model->getBook($_GET['book']);
include 'view/viewbook.php';
}
}
}
|
Mô hình dưới đây minh họa dễ hiểu hơn cho bạn
b. Model
Model đại diện cho dữ liệu và logic của ứng dụng, thường hay gọi là business logic. Model có trách nhiệm :
– Thêm, xóa sửa dữ liệu,…
– Là nơi thực thi logic nghiệp vụ của ứng dụng. Đối với những bạn mới tìm hiểu về MVC, chúng ta thường
nhầm lẫn và thực thì logic của nghiệp vụ ở bên trong Controller hoăc View
Ví dụ dưới đây cho chúng ta thấy lớp model được đại diện bởi 2 class là : “Model” và “Book”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
include_once("model/Book.php");
class Model {
public function getBookList()
{
// Dưới đây mình gắn cứng 1 array để mô phỏng dữ liệu trong database
return array(
"Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."),
"Moonwalker" => new Book("Moonwalker", "J. Walker", ""),
"PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "")
);
}
public function getBook($title)
{
//Gọi function getBooklist để lấy dữ liệu cần thiết
//Trong thực tế ở đây bạn sẽ dùng câu truy vấn select vào trong database
$allBooks = $this->getBookList();
return $allBooks[$title];
}
}
|
Class Book trong file Book.php
|
class Book {
public $title;
public $author;
public $description;
public function __construct($title, $author, $description) {
$this->title = $title;
$this->author = $author;
$this->description = $description;
}
}
|
c. View
View chịu trách nhiệm định đạng lại dữ liệu được truyền ra từ model.
Dữ liệu được truyền ra có thể có nhiều định dạng khác nhau tùy vào cách
người lập trình xử lý như là xml, json, array,..
Lưu ý là bạn đừng nên nhập nhằng, khó hiểu giữa view và template. Khi
nhận được dữ liệu với định dạng nhất định từ hệ thống, tiếp tục view sẽ
làm thao tác chuyển đổi dữ liệu thành một cấu trúc html cho người dùng
thấy được. Thông thường 1 controller sẽ chỉ định gửi dữ liệu đến 1 view
cụ thể. Chẳng hạn với công việc hiển thị tài khoản người dùng, thì
Controller “display account” sẽ gọi đến lớp view “display account”. Tại
đây, lớp view sẽ sử dụng 1 template có sẵn trong hệ thống để render ra
các trang html. Mẫu template có sẵn này xử dụng lại những phần cố định
của website như header, footer, menu,..
Đoạn code dưới đây cho ta 2 view dùng để hiển thị 1 quyển sách và nhiều quyền sách
viewbook.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<html>
<head></head>
<body>
echo 'Title:' . $book->title . ' ';
echo 'Author:' . $book->author . ' ';
echo 'Description:' . $book->description . ' ';
?>
</body>
</html>
|
booklist.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<html>
<head></head>
<body>
<table>
<tbody><tr><td>Title</td><td>Author</td><td>Description</td></tr></tbody>
foreach ($books as $title => $book)
{
echo '
. |
$book->title.'">'.$book->title.'
|
Cám ơn bạn đã bỏ công dịch, nhưng cũng nên trích nguồn bài viết gốc ra nhé bạn