CÁCH HIỆN THỰC MÔ HÌNH MVC VỚI PHP

Đặt vấn đề

Mô hình MVC là mô hình được sử dụng rộng rãi nhất trong việc phát triển ứng dụng web, là một mô hình kiến phần mềm được tạo ra với mục đích quản lý và xây dựng dự án phần mềm có hệ thống hơn

Trong PHP hiện tại có khá nhiều Framework và tất cả đều xây dựng từ mô hình MVC, từ đó bạn có thể thấy sự quan trọng của nó như thế nào rồi đấy

Mô hình MVC

Các thành phần trong mô hình MVC

Mô hình này gồm 3 thành phần chính, mỗi thành phần đảm nhiệm một vai trò khác nhau

  • Model: có nhiệm vụ thao tác với cơ sở dữ liệu, nghĩa là nó sẽ chứa tất cả các hàm, các phương thức truy vấn trực tiếp với dữ liệu và controller sẽ thông qua các hàm, phương thức đó để lấy dữ liệu rồi gửi qua View
  • View: có nhiệm vụ tiếp nhận dữ liệu từ controller và hiển thị nội dung sang các đoạn mã HTML, bạn có thể hiểu nôm na đây người ta còn gọi là thành phần giao diện.
  • Controller: đóng vài trò trung gian giữa Model và View. Nó có nhiệm vụ tiếp nhận yêu cầu từ client sau đó xử lý request, load model tương ứng và gửi data qua view tương ứng rồi trả kết quả về cho client

MVC Pattern cần có trong mọi framework PHP - All Laravel

Luồng xử lý trong mô hình MVC

Bước 1: Dựa vào yêu cầu (request) của người dùng controller sẽ gọi tới một hàm (action) và lấy dữ liệu nếu cần thông qua model

Bước 2: Sau khi có dữ liệu controller sẽ gửi qua View, lúc này view có nhiệm vụ xử lý dữ liệu và chuyển thành những đoạn mã HTML

Bước 3: Sau khi view kết thúc thì controller sẽ gửi trả nội dung HTML của view về cho client

Tổ chức website PHP theo mô hình MVC

/var/folders/9g/dcg175n97b950p4vr8s_y2rh0000gn/T/com.microsoft.Word/Content.MSO/D7CA65E9.tmp

Cấu trúc website được tổ chức như hình bên dưới, trong đó index.php là file đóng vai trò như là router của website

  1. Cài đặt router – index.php

Mọi yêu cầu – request từ người dùng trong mô hình MVC đều phải chịu sự điều hướng bởi router, sau đây là một cách viết route đơn giản trong PHP dành cho các bạn mới làm quen với MVC PHP.

Với cách cài đặt này thì mọi liên kết trong trang đều phải có dạng: /mvc-implement/index/php/xxx

<?php

$currentController = ‘Home’;

$currentMethod = ‘index’;

$params = [];

//hàm lấy các thành phần tren url

//ví dụ: domain/mvc-implement/index/product/detail/1

function getUrl(){

$url = rtrim($_SERVER[‘REQUEST_URI’], ‘/’);

$url = filter_var($url, FILTER_SANITIZE_URL);

$url = explode(‘/’, $url);

return $url;//[domain,mvc-implement,index,product,detail,1]

}

//lay URL

$url = getUrl();

unset($url[0]);unset($url[1]);unset($url[2]);

//kiểm tra tồn tại controller thì cập nhật controller lại

if(isset($url[3])){

if(file_exists(ucwords(‘controllers/’.$url[3]). ‘.php’)){

$currentController = ucwords($url[3]);

unset($url[3]);

}

}

//chuyển đièu yêu cầu cho controller

require_once ‘controllers/’.$currentController . ‘.php’;

//chọn phương thức thực hiện yêu cầu

if(isset($url[4])){

$currentMethod = $url[4];

unset($url[4]);

}

// Lay danh tham so cho phương thức

$params = $url ? array_values($url) : [];

//goi ham voi tham so la mang tham so

call_user_func_array($currentMethod, $params);

Ví dụ khi có request

http://127.0.0.1/mvc-implement/index.php

Server thực hiện route như sau:

  • Lấy mảng $url với hàm getUrl() tại dòng 14 và kết quả là mảng:

[domain,mvc-implement,index.php]

  • Do mảng chỉ có chỉ số max là 2, nên các dòng còn lại không được thực thi
  • Dòng lệnh cuối cùng, dòng 33 hàm index nằm trong contronller Home

http://127.0.0.1/mvc-implement/index.php/product

Server thực hiện route như sau:

  • Lấy mảng $url với hàm getUrl() tại dòng 14 và kết quả là mảng:

[domain,mvc-implement,index.php,product]

  • Do mảng có chỉ số max là 3, nên dòng lệnh 17 thỏa mãng và cập nhật lại controller để xử lý yêu câu này là Product
  • Do không có phần tử là action nên mặt định action là index
  • Dòng lệnh cuối cùng, dòng 33 hàm index nằm trong contronller Product
  1. Controller

Việc còn lại là chúng ta xây dựng các controller tương ứng cho website với các hành động để response lại các yêu cầu khi được router điều hướng tới

Sau đây là controller Product, với hàm index trả về views với tất cả sản phẩm, hàm detail trả về view hiển thị thông tin chi tiết sản phẩm theo mã sản phẩm

<?php

require_once ‘models/Product.php’;

function index()

{

//lay du lieu tu model

$products=getAll();

require_once ‘views/products/product.php’;

}

function detail($id)

{

//lay san phan can xem->lay san pham theo ma

$product = getProductgByID($id);

require_once ‘views/products/productDetail.php’;

}

Trong ví dụ trên các bạn xây dựng thêm model Product chứa các phương thức getAll() để lấy tất cả sản phẩm trong database và getProductByID($id) lấy thông tin chi tiết 1 sản phẩm

  1. View

Công việc còn lại là thiết kế view hiển thị kết quả và trả về cho người dùng

http://127.0.0.1/mvc-implement/index.php/product

http://127.0.0.1/mvc-implement/index.php/product/detail/5

Vậy là chúng ta có thể tổ chức website theo mô hình MVC rồi đó các bạn. Có rất nhiều cách tổ chức khác nhau, bài viết này chỉ là một cách tổ chức đơn giản dành cho các bạn mới làm quen với MVC PHP.

Một lần nữa hy vọng bài viết mang lại cho các bạn sinh viên một kênh tham khảo về cách hiện thực website PHP với mô hình MVC

Tác giả: Thy Đào Quốc - Ngày viết: 22/03/2023

Danh mục: Chương trình đào tạo, CNTT - Thiết kế Website, CNTT - Ứng dụng phần mềm, Ngành Công nghệ thông tin - Ứng dụng phần mềm, NHÓM NGÀNH CÔNG NGHỆ THÔNG TIN

ĐỂ LẠI CÂU HỎI NẾU BẠN CÓ THẮC MẮC

GỬI BÌNH LUẬN

Hãy bình luận/đặt câu hỏi cùng Cao Đẳng Việt Mỹ ngay nhé.
Thông tin của bạn sẽ không được hiển thị công khai.
Các trường bắt buộc được đánh dấu *