Nếu bạn là một người mới bắt đầu học lập trình web (đặc biệt là PHP), chắc hẳn bạn đã từng trải qua giai đoạn này: Viết tất cả mọi thứ vào một file duy nhất.
Bạn tạo một file index.php. Trong đó, bạn viết câu lệnh kết nối Database, sau đó là câu truy vấn SQL, rồi xử lý logic if-else, và cuối cùng là chèn cả đống thẻ HTML/CSS để hiển thị dữ liệu.
Code chạy được không? Có. Nhưng chuyện gì xảy ra sau 1 tháng?
File index.php đó dài hàng nghìn dòng. Mỗi lần muốn sửa màu cái nút bấm, bạn phải lội qua hàng trăm dòng code SQL. Mỗi lần muốn sửa logic tính tiền, bạn sợ lỡ tay xóa mất thẻ </div> khiến giao diện vỡ tung tóe.
Đó chính là lúc bạn cần đến MVC.
1. MVC là gì?
MVC là viết tắt của Model - View - Controller.
Đây không phải là một ngôn ngữ lập trình, cũng không phải là một công nghệ. Nó là một Mẫu kiến trúc phần mềm (Architectural Pattern). Hiểu đơn giản như thế này, MVC là một “cách tổ chức code” khoa học, giúp chia nhỏ dự án của bạn thành 3 phần riêng biệt với 3 nhiệm vụ khác nhau, không ai dẫm chân lên ai.
Để hiểu rõ MVC, chúng ta hãy bỏ qua những dòng code khô khan đi và bước vào một ví dụ một nhà hàng sang trọng.
2. Giải mã MVC thông qua ví dụ “Mô hình Nhà hàng”
Hãy tưởng tượng bạn (User/Người dùng) bước vào một nhà hàng để ăn tối. Quy trình đó sẽ diễn ra như thế nào?
- Bạn ngồi vào bàn và gọi món bò bít tết.
- Người phục vụ (Waiter) ghi lại yêu cầu của bạn và mang xuống bếp.
- Đầu bếp (Chef) trong bếp nhận đơn, lấy thịt bò từ kho lạnh, chế biến, nấu nướng.
- Sau khi món ăn chín, đầu bếp đưa lại cho người phục vụ.
- Người phục vụ mang món ăn đã được bày biện đẹp mắt lên bàn cho bạn.
Trong ví dụ này, 3 thành phần của MVC ứng với 3 vị trí trong nhà hàng:
C - Controller (Người phục vụ)
Controller chính là anh bồi bàn.
- Nhiệm vụ: Tiếp nhận yêu cầu (Request) từ khách hàng. Anh ta là người đứng giữa, điều phối mọi việc.
- Đặc điểm: Anh ta không trực tiếp nấu ăn (không xử lý dữ liệu), cũng không ăn giùm khách (không hiển thị). Anh ta chỉ nhận lệnh từ khách -> báo cho bếp -> nhận món từ bếp -> mang ra cho khách.
M - Model (Đầu bếp & Kho nguyên liệu)
Model chính là khu vực nhà bếp và bác đầu bếp.
- Nhiệm vụ: Xử lý các nghiệp vụ logic “nặng nhọc” nhất. Kiểm tra xem còn thịt bò không (Check Database), chế biến món ăn (Xử lý dữ liệu).
- Đặc điểm: Đầu bếp chỉ quan tâm đến việc nấu sao cho ngon, đúng công thức. Đầu bếp không quan tâm khách hàng ngồi bàn số mấy, hay cái đĩa đựng thức ăn có hoa văn gì.
V - View (Món ăn & Cách bày trí)
View chính là món ăn được bày trên đĩa mà bạn nhìn thấy.
- Nhiệm vụ: Hiển thị dữ liệu cho người dùng xem. Trong lập trình web, đây chính là các file HTML/CSS/Javascript.
- Đặc điểm: View không biết món bò này được nấu bao lâu, lấy từ kho lạnh nào. Nó chỉ có nhiệm vụ: “Controller đưa tôi cái gì, tôi hiện cái đó lên màn hình sao cho đẹp”.
3. Tại sao lại phải chia tách như vậy?
Tại sao đầu bếp không chạy ra order món luôn cho lẹ? Hay sao người phục vụ không tự vào bếp nấu luôn?
Nếu nhà hàng chỉ có 1 khách, thì việc làm từ A-Z (giống như cách bạn code tất cả chỉ trong 1 file) rất nhanh. Nhưng nếu nhà hàng có 100 khách thì sao ?
- Nếu người phục vụ chạy vào nấu ăn -> Không ai tiếp khách mới.
- Nếu đầu bếp chạy ra ghi order -> Món ăn trong bếp bị cháy.
Trong lập trình cũng vậy, mô hình MVC mang lại những lợi ích khổng lồ:
a. Dễ dàng bảo trì (Maintenance)
Giả sử sếp đưa ra yêu cầu: “Đổi màu cái nút Mua Hàng từ đỏ sang xanh”.
- Nếu code gộp: Bạn phải soi trong hàng nghìn dòng logic PHP để tìm dòng HTML.
- Nếu dùng MVC: Bạn chỉ cần vào thư mục
Views, mở file HTML lên sửa. Logic tính tiền trongModelhoàn toàn không bị ảnh hưởng. Rất an toàn!
b. Làm việc nhóm (Teamwork)
Mô hình MVC cho phép tách biệt công việc rõ ràng:
- Frontend Dev: Chỉ làm việc với View (HTML/CSS/JS). Không cần biết SQL là gì.
- Backend Dev: Chỉ làm việc với Model và Controller (PHP/MySQL). Không cần quan tâm CSS căn chỉnh ra sao. Hai người có thể làm song song mà không sợ sửa code đè lên nhau.
c. Tái sử dụng code (Reusability)
Một logic xử lý trong Model (ví dụ: Hàm tính thuế VAT) có thể được gọi bởi nhiều Controller khác nhau. Bạn viết 1 lần và dùng lại ở nhiều nơi.
4. Luồng đi của dữ liệu trong MVC (Workflow)
Để tổng kết lại, hãy xem một request thực tế trên website diễn ra như thế nào. Ví dụ: Bạn truy cập vào trang: https://loclaptrinh.com/nhan-vien/chi-tiet/10 (Xem thông tin nhân viên có ID là 10).
- Request: Trình duyệt gửi yêu cầu đến Server.
- Routing (Bộ định tuyến): Server nhìn URL và biết cần gọi Controller nào (Ví dụ:
NhanVienController). - Controller: Nhận lệnh “À, khách muốn xem ông số 10”. Controller gọi sang Model: “Ê Model, lấy cho tao thông tin thằng nhân viên số 10 coi”.
- Model: Kết nối Database, chạy câu lệnh
SELECT * FROM nhan_vien WHERE id = 10. Có dữ liệu rồi, Model trả ngược lại cho Controller. - Controller: Nhận cục dữ liệu từ Model. Bây giờ Controller gọi View: “Ê View, tao có dữ liệu ông số 10 rồi nè, mày đổ dữ liệu này vào giao diện HTML dùm tao”.
- View: Nhận dữ liệu, nhúng vào các thẻ HTML tương ứng, tạo thành một trang web hoàn chỉnh.
- Response: Trả toàn bộ trang web đó về cho trình duyệt của người dùng.
5. Kết luận
MVC không phải là điều gì quá cao siêu. Nó đơn giản là tư duy ngăn nắp.
- Dữ liệu (Data) -> Vứt vào Model.
- Giao diện (Interface) -> Vứt vào View.
- Logic điều hướng -> Vứt vào Controller.
Khi bạn đã hiểu được tư duy này, bạn có thể học bất kỳ Framework hiện đại nào như Laravel, CodeIgniter, Symfony (PHP) hay thậm chí là Spring Boot (Java), ASP.NET (C#) một cách dễ dàng, vì tất cả chúng đều vận hành dựa trên trái tim là MVC.
Bạn đã nắm vững lý thuyết kiến trúc nhà hàng rồi chứ?
Ở bài tiếp theo, chúng ta sẽ đi sâu vào “nhà bếp” để xem các đầu bếp xử lý nguyên liệu như thế nào qua khái niệm quan trọng nhất của lập trình Backend.
👉 Đọc tiếp: CRUD là gì? 4 thao tác sinh tử của mọi lập trình viên Backend
