MÔ HÌNH PHP MVC
Giảng viên : ThS. Nguyễn Minh Thành
Email : 
[email protected]
Chương 7 : 
Môn Các Hệ Thống Mã Nguồn Mở 1
Nội Dung
1. Khái niệm về kiến trúc phần mềm
2. Tổng quan về kiến trúc 3 lớp
3. Tổng quan về kiến trúc MVC
4. So sánh MVC và 3 lớp
5. Xây dựng website PHP MVC đơn giản 
6. Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 2
Khái niệm về kiến trúc phần mềm
Môn Các Hệ Thống Mã Nguồn Mở 3
“Kiến trúc phần mềm của một chương trình hoặc hệ
thống tính toán là cấu trúc hoặc các cấu trúc của hệ
thống đó, gồm các thành phần của phần mềm, các thuộc
tính có thể trông thấy được từ bên ngoài của các thành
phần này, và các mối quan hệ giữa chúng.”
Phát triển phần mềm theo một kiến trúc nhất định sẽ giúp
cho việc quản lý hệ thống được tốt hơn và tận dụng tài
nguyên của hệ thống hiệu quả hơn. Đồng thời cũng dễ
bảo trì và mở rộng.
Tổng quan về mô hình 3 lớp
Môn Các Hệ Thống Mã Nguồn Mở 4
Để dễ quản lý các thành phần của hệ thống, cũng 
như không bị ảnh hưởng bởi các thay đổi, người ta 
hay nhóm các thành phần có cùng chức năng lại với 
nhau và phân chia trách nhiệm cho từng nhóm để 
công việc không bị chồng chéo và ảnh hưởng lẫn 
nhau. Một trong những mô hình lập trình như vậy đó 
là Mô hình 3 lớp (Three Layers).
Các thành phần trong 3-Layer
Môn Các Hệ Thống Mã Nguồn Mở 5
Mô hình 3 lớp được cấu thành từ: Presentation Layers, Business Logic Layers, và 
Data Access Layers. 
Cách vận hành của mô hình
Môn Các Hệ Thống Mã Nguồn Mở 6
Đối với 3-Layer, yêu cầu được xử lý tuần tự qua các layer như hình.
- Đầu tiên User giao tiếp với Presentation Layers (GUI) để gửi đi thông tin và yêu 
cầu. Tại layer này, các thông tin sẽ được kiểm tra, nếu OK chúng sẽ được chuyển 
xuống Business Logic Layer (BLL).
- Tại BLL, các thông tin sẽ được nhào nặn, tính toán theo đúng yêu cầu đã gửi, nếu 
không cần đến Database thì BLL sẽ gửi trả kết quả về GUI, ngược lại nó sẽ đẩy dữ 
liệu (thông tin đã xử lý) xuống Data Access Layer (DAL).
- DAL sẽ thao tác với Database và trả kết quả về cho BLL, BLL kiểm tra và gửi nó 
lên GUI để hiển thị cho người dùng.
- Một khi gặp lỗi (các trường hợp không đúng dữ liệu) thì đang ở layer nào thì quăng 
lên trên layer cao hơn nó 1 bậc cho tới GUI thì sẽ quăng ra cho người dùng biết
- Các dữ liệu được trung chuyển giữa các Layer thông qua một đối tượng gọi là 
Data Transfer Object (DTO), đơn giản đây chỉ là các Class đại diện cho các đối 
tượng được lưu trữ trong Database.
Tổ chức mô hình 3-Layer
Có rất nhiều cách đặt tên cho các thành phần của 3 lớp như:
Cách 1: GUI, BUS, DAL
Cách 2: GUI, BLL, DAO, DTO
Cách 3: Presentation, BLL, DAL
Tổng quan mô hình MVC
• MVC là một mô hình trong phát triển phần mềm chuyên 
giành cho website.
Môn Các Hệ Thống Mã Nguồn Mở 7
Các Thành Phần Trong MVC
• Trong kiến trúc này, hệ thống được chia thành 3 tầng tương 
ứng đúng với tên gọi của nó (Model – View – Controller). Ở đó 
nhiệm vụ cụ thể của các tầng được phân chia như sau:
1. Model (Tầng dữ liệu): là một đối tượng hoặc một tập hợp 
các đối tượng biểu diễn cho phần dữ liệu của chương trình. Nó 
được giao nhiệm vụ cung cấp dữ liệu cho cơ sở dữ liệu và lưu 
dữ liệu vào các kho chứa dữ liệu. Tất cả các nghiệp vụ logic 
được thực thi ở Model. Dữ liệu vào từ người dùng sẽ thông 
qua View đến Controller và được kiểm tra ở Model trước khi 
lưu vào cơ sở dữ liệu. Việc truy xuất, xác nhận, và lưu dữ liệu 
là một phần của Model
Môn Các Hệ Thống Mã Nguồn Mở 8
Các Thành Phần Trong MVC
• 2. View (Tầng giao diện): là phần giao diện với người 
dùng, bao gồm việc hiện dữ liệu ra màn hình, cung cấp 
các menu, nút bấm, hộp đối thoại, chọn lựa …, để người 
dùng có thể thêm, xóa. sửa, tìm kiếm và làm các thao tác 
khác đối với dữ liệu trong hệ thống.. Thông thường, các 
thông tin cần hiển thị được lấy từ thành phần Models.
3. Controller (Tầng điều khiển): là phần điều khiển của 
ứng dụng, điều hướng các nhiệm vụ (task) đến đúng 
phương thức (method) có chức năng xử lý nhiệm vụ đó. 
Nó chịu trách nhiệm xử lý các tác động về mặt giao diện, 
các thao tác đối với models, và cuối cùng là chọn một 
view thích hợp để hiển thị ra màn hình.
Môn Các Hệ Thống Mã Nguồn Mở 9
Ưu – nhược điểm
• 1. Ưu điểm:
Phát triển phần mềm: Có tính chuyên nghiệp hóa, có thể chia 
cho nhiều nhóm được đào tạo nhiều kỹ năng khác nhau, từ 
thiết kế mỹ thuật cho đến lập trình đến tổ chức database. Giúp 
phát triển ứng dụng nhanh, đơn giản, dễ nâng cấp..
Bảo trì: Với các lớp được phân chia theo như đã nói, thì các 
thành phần của một hệ thống dễ được thay đổi, nhưng sự thay 
đổi có thể được cô lập trong từng lớp, hoặc chỉ ảnh hưởng đến 
lớp ngay gần kề của nó, chứ không phát tán náo loạn trong cả 
chương trình.
Mở rộng: Với các lớp được chia theo ba lớp như đã nói, việc 
thêm chức năng vào cho từng lớp sẽ dễ dàng hơn là phân chia 
theo cách khác.
2. Nhược điểm:
Đối với dự án nhỏ việc áp dụng mô hình MC gây cồng kềnh, 
tốn thời gian trong quá trình phát triể.
Tốn thời gian trung chuyển dữ liệu của các tầng
Môn Các Hệ Thống Mã Nguồn Mở 10
So sánh MVC và 3 lớp
Môn Các Hệ Thống Mã Nguồn Mở 11
• 1. Điểm giống:
Tách rời programming core/business logic ra khỏi những 
phụ thuộc về tài nguyên và môi trường.
Presentation Layer (PL) thể hiện giống như chức năng 
của View và Controller. Business Layer (BL) và Data 
Access Layer (DL) thể hiện giống như chức năng của 
Model. Như thế nhìn ở góc độ này, thì MVC tương đương 
với 3-layer (tất nhiên có chồng chéo như hình vẽ)
So sánh MVC và 3 lớp
Môn Các Hệ Thống Mã Nguồn Mở 12
2. Điểm khác:
Trong mô hình 3 lớp, quá trình đi theo chiều dọc, bắt đầu từ PL, sang 
BL, rồi tới DL, và từ DL, chạy ngược lại BL rồi quay ra lại PL.
Còn trong mô hình MVC, dữ liệu được nhận bởi View, View sẽ 
chuyển cho Controller cập nhật vào Model, rồi sau đó dữ liệu trong 
Model sẽ được đưa lại cho View mà không thông qua Controller, do 
vậy luồng xử lý này có hình tam giác.
Xây dựng website PHP MVC đơn giản
• Xây dựng website bookstore theo mô hình MVC
• B1 : Xây dựng cấu trúc Website như sau 
• Thư mục controller chứa các thành phần điều kiển của ứng dụng
• Thư mục model chứa các lớp đối tượng dữ liệu
• Thư mục view chứa các thành phần giao diện
• Index.php là trang chủ của website
Môn Các Hệ Thống Mã Nguồn Mở 13
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 14
• B2 : Xây dựng các đối tượng dữ liệu
• File Book.php chứa khai báo lớp dữ liệu Book
<?php
class Book{
public $title;
public $author;
public $description;
public function __construct($title, $author, $des)
{
$this->title = $title;
$this->author = $author;
$this->description = $des;
}
}
?>
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 15
• B2 : Xây dựng các đối tượng dữ liệu
• File Database.php chứa các thao tác kết nối CSDL để lấy dữ liệu, ở đây 
để thao tác đơn, ví dụ chỉ demo có một mảng dữ liệu cho trước.
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 16
• B3 : Xây dựng các đối tượng view
• File booklist.php để xem danh sách book
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 17
• B3 : Xây dựng các đối tượng view
• File viewbook.php để xem một cuốn sách
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 18
• B4 : Xây dựng các đối tượng controller
• File controller.php điều khiển các luồng truy cập,
• Khi Website có nhiều đối tượng dữ liệu, thì các controller sẽ được đặt 
tên theo từng loại dữ liệu. (vd : BookController, AuthorController…)
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 19
• B5 : Xây dựng trang chủ của website
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 20
• B6 : Thực Thi Website
Xây dựng website PHP MVC đơn giản
Môn Các Hệ Thống Mã Nguồn Mở 21
• B6 : Thực Thi Website
Framework PHP MVC cơ bản
Môn Các Hệ Thống Mã Nguồn Mở 22
• Framework (FW) là một kiến trúc nền tảng để phát triển 
phần mềm. 
• FW cung cấp các chức năng chung, phổ biến và có thể 
tái sử dụng cho các lập trình viên để phát triển các giải 
pháp, các phần mềm khác nhau.
• FW giúp các lập trình viên không phải xây dựng hệ thống 
từ đầu, tiết kiệm thời gian trong quá trình phát triển phần 
mềm.
• Có nhiều Framework có sẵn như : .NET FW, Zend FW, 
Spring FW,…
• Để sử dụng tốt một Framework cần nhiều thời gian.
• Có thể xây dựng một Framework riêng để đỡ mất thời gian huấn 
luyện và FW gọn nhẹ.
Framework PHP MVC cơ bản
Môn Các Hệ Thống Mã Nguồn Mở 23
• Các bước xây dựng Framework MVC đơn giản cho 
website PHP như sau :
• Bước 1 : Xây dựng cấu trúc thư mục FW
application – code chỉ định cho ứng dụng 
config – cấu hình Database
db – sao lưu dữ liệu
library – chứa framework
public – Các file hình ảnh cho ứng dụng
scripts –Các script nhúng
tmp – dữ liệu tạm
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 24
• Lưu ý :
• 1. Các bảng trong mySQL sẽ là chữ thường và số nhiều. Ví dụ : 
products, books, customers… Các cột mã sẽ có mẫu : tênbảng_id. Ví 
dụ : Product_id,….
2. Các lớp model sẽ là số ít và in hoa chữ đầu. Ví dụ : Product, Book, 
Customer…
3. Các lớp Controller thêm chữ Controller sau Model (có s). Ví dụ : 
BooksController, CustomersController…
4. Các giao diện View sẽ được chứa trong thư mục của từng Model, 
tên thư mục là chữ thường số nhiều, và mỗi view sẽ có tên tùy vào 
hành động trong Controller. Ví dụ : books\view.php, books\viewall.php, 
books\buy.php…
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 25
• Mô hình hoạt động
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 26
• Bước 2 : Tạo file .htaccess trong thư mục gốc để chuyển 
tất cả các request đến thư mục public.
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 27
• Bước 3 : Tạo file .htaccess trong thư mục public để 
chuyển tất cả các request đến file public/index.php để xử 
lý theo mẫu : public/index.php?url=PATHNAME 
(PATHNAME chính là đường dẫn được người dùng gõ)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 28
• Bước 4 : Tạo file index.php trong thư mục public để định 
nghĩa các hằng và gọi file bootstrap.php
<?php
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(dirname(__FILE__)));
$url = $_GET['url'];
require_once (ROOT . DS . 'library' . DS . 
'bootstrap.php');
?>
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 29
• Bước 5 : Tạo file bootstrap.php trong thư mục library. File 
này sẽ gọi các file cấu hình và các file khác.
<?php
require_once (ROOT . DS . 'config' . DS . 
'config.php');
require_once (ROOT . DS . 'config' . DS . 
'routing.php');
require_once (ROOT . DS . 'library' . DS . 
'shared.php');
?>
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 30
• Bước 6 : Tạo file config.php và routing.php trong thư mục 
config
<?php
/** Configuration Variables **/
define ('DEVELOPMENT_ENVIRONMENT',true);
define('DB_NAME', 'bookonline');
define('DB_USER', 'root');
define('DB_PASSWORD', 'cdcntt');
define('DB_HOST', 'localhost');
define('BASE_PATH','
');
define('PAGINATE_LIMIT', '5');
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 31
• Bước 6 : Tạo file config.php và routing.php trong thư mục 
config
<?php
$routing = array(
'/admin\/(.*?)\/(.*?)\/(.*)/' => 
'admin/\1_\2/\3'
);
//…thêm một số routing cần thiết
$default['controller'] = 'homes';
$default['action'] = 'index';
?>
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 32
• Bước 7 : Tạo file shared.php, đây là file chính sẽ phân 
tích request và gọi controller tương ứng
/** Main Call Function **/
function callHook() {
global $url; 
$urlArray = array(); $urlArray = explode("/",$url);
$controller = $urlArray[0]; array_shift($urlArray);
$action = $urlArray[0]; array_shift($urlArray);
$queryString = $urlArray;
$controllerName = $controller; 
$controller = ucwords($controller); 
$model = rtrim($controller, 's'); 
$controller .= 'Controller';
$dispatch = new $controller($model,$controllerName,$action);
if ((int)method_exists($controller, $action)) {
call_user_func_array(array($dispatch,$action),$queryString);
} else {
/* Error Generation Code Here */
}
}
callHook();
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 33
• Bước 7 : trong file shared.php còn chứa hàm __autoload từ 
động tìm kiếm khai báo lớp khi có 1 đối tượng được tạo
function __autoload($className) {
if (file_exists(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php')) {
require_once(ROOT . DS . 'library' . DS . strtolower($className) . 
'.class.php');
} else if (file_exists(ROOT . DS . 'application' . DS . 'controllers' . DS . 
strtolower($className) . '.php')) {
require_once(ROOT . DS . 'application' . DS . 'controllers' . DS . 
strtolower($className) . '.php');
} else if (file_exists(ROOT . DS . 'application' . DS . 'models' . DS . 
strtolower($className) . '.php')) {
require_once(ROOT . DS . 'application' . DS . 'models' . DS . 
strtolower($className) . '.php');
} else {
/* Error Generation Code Here */
echo "Can not load class {$className}.";
}
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 34
• Bước 8 : tiếp theo ta sẽ xây dựng các đối tượng trong mô hình MVC. 
Các controller sẽ được kế thừa từ một lớp Controller gốc được chứa 
trong file library/controller.php
class Controller {
protected $_model;
protected $_controller; 
protected $_action;
protected $_template;
function __construct($model, $controller, $action) {
$this->_controller = $controller;
$this->_action = $action;
$this->_model = $model;
$this->_template = new Template($controller,$action);
}
function set($name,$value) {$this->_template->set($name,$value); }
function __destruct() { $this->_template->render(); }
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 35
• Bước 8 : trong Controller có gọi lớp Template là lớp thực hiện việc 
render nội dung với view tương ứng
class Template {
protected $variables = array();
protected $_controller; //tacgias
protected $_action; //viewall
function __construct($controller,$action) {
$this->_controller = $controller;
$this->_action = $action;
}
function set($name,$value) {
$this->variables[$name] = $value;
}
function render() {
….
}
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 36
• Bước 8 : các lớp Controller theo từng ứng dụng. Ví dụ : 
TacgiasController (trong thư mục application/controllers)
<?php
class TacgiasController extends Controller {
function view($id = null,$name = null) {
$model = new $this->_model();
$this->set('title','Tác giả : '.$name.' - Book Online App');
$this->set('datatable',$model->select($id));
}
function viewall() {
$model = new $this->_model();
$this->set('title','Danh sách tác giả - Book Online App');
$this->set('datatable',$model->selectAll());
} 
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 37
• Bước 8 : các view giao diện, ví dụ : viewall.php (trong thư mục 
application/views/tacgias/viewall.php)
<a href="../tacgias/view/<?php echo 
$tacgia['Tacgia']['MaTG']?>/<?php echo strtolower(str_replace(" ","-
",$tacgia['Tacgia']['TenTG']))?>">
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 38
• Bước 8 : trong lớp TacgiasController có gọi tạo lớp Tacgia (lớp model) 
trong thư mục application/models/tacgia.php. Các lớp model thực chất 
là lớp kết nối CSDL để lấy dữ liệu theo từng câu truy vấn. 
<?php
class Tacgia extends Model {
}
?>
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 39
• Bước 8 : lớp Model cha (trong library)
class Model extends SQLQuery {
protected $_model;
function __construct() {
$this-
>connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
$this->_model = get_class($this);
//$this->_table = strtolower($this->_model)."s";
$this->_table = strtolower($this->_model);
}
function __destruct() {
$this->disconnect();
}
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 40
• Bước 8 : lớp SqlQuery gốc (trong library)
<?php
class SQLQuery {
protected $_dbHandle;
protected $_result;
function connect($address, $account, $pwd, $name) { }
function disconnect() { }
function selectAll() { }
function select($id) { }
function query($query, $singleResult = 0) { }
}
Framework MVC cho website PHP
Môn Các Hệ Thống Mã Nguồn Mở 41
• Bước 9 : Gọi ứng dựng theo 
mẫu
• 
n/query
HỎI ĐÁP ?
Môn Các Hệ Thống Mã Nguồn Mở 42