Dù ở đâu: Nhà hàng, quán cà phê, tiệm phở...Mọi công việc đều có sự phân công, mỗi người mỗi việc. Không ai "tranh việc" của ai...Như vậy mới công bằng! Nếu bạn vừa đọc xong bài Framework là gì?
Có thể bạn sẽ gặp ngay một cụm từ:
MVC
Nhìn lần đầu.
Có vẻ rất...
"Hàn lâm."
Model.
View.
Controller.
Rồi bạn mở tài liệu Laravel.
Thấy:
app/
|- Models/
|- Http/
│ |-- Controllers/
|- resources/
|-- views/
Bạn bắt đầu nghĩ:
"Ủa... sao phải chia code ra nhiều chỗ vậy?"
Tại sao không viết hết vào một file PHP cho nhanh?
Câu trả lời nằm ở...
Một nhà hàng.
MVC là gì?
MVC là viết tắt của Model – View – Controller, một mô hình tổ chức ứng dụng thành ba phần có nhiệm vụ khác nhau:
Model: xử lý dữ liệu và làm việc với Database.
View: hiển thị giao diện cho người dùng.
Controller: tiếp nhận yêu cầu, xử lý logic và điều phối Model với View.
Mục đích của MVC là giúp code được tổ chức rõ ràng, dễ đọc, dễ sửa và dễ mở rộng.
Ví dụ về...ăn uống
Hãy tưởng tượng.
Bạn bước vào một nhà hàng.
Bạn "dõng dạc" gọi:
"Cho em một tô phở tái nạm gàu."
Ai làm gì?
Nhân viên phục vụ
Nhận order.
↓
Đầu bếp
Nấu phở.
↓
Nhân viên
Mang phở ra.
Đó chính là tinh thần của MVC: Phân công nhiệm vụ rõ ràng.
Controller là ai?
Controller giống như:
Nhân viên phục vụ.
Khách hàng gọi món.
↓
Controller nhận yêu cầu.
Ví dụ:
GET /products
Controller nói:
"À, khách muốn xem danh sách sản phẩm."
↓
Controller gọi Model.
"Lấy danh sách sản phẩm giúp tôi."
Model là ai?
Model giống như:
Đầu bếp + người quản lý kho.
Model làm việc với dữ liệu.
Ví dụ:
- Products
- Users
- Orders
- Posts
Model có thể hỏi Database:
"Cho tôi danh sách sản phẩm."
Database trả về.
↓
Model nhận dữ liệu.
↓
Gửi lại Controller.
View là ai?
View giống như:
Chiếc đĩa thức ăn mang ra cho khách.
Controller đã có dữ liệu.
Bây giờ cần hiển thị.
Ví dụ:
- Tên sản phẩm
- Giá
- Hình ảnh
- Mô tả
View biến dữ liệu thành giao diện.
↓
Người dùng nhìn thấy.
Toàn bộ quy trình
Hãy nhìn thật chậm.
Bạn mở:
/products
↓
1. Controller nhận yêu cầu
"Khách muốn xem sản phẩm."
↓
2. Controller gọi Model
"Lấy danh sách sản phẩm."
↓
3. Model hỏi Database
"SELECT * FROM products"
↓
4. Database trả dữ liệu
↓
5. Model trả dữ liệu cho Controller
↓
6. Controller gửi dữ liệu cho View
↓
7. View tạo giao diện
↓
8. Trình duyệt hiển thị
Nhìn bằng sơ đồ sẽ dễ hơn
Người dùng
↓
Controller
↓
Model
↓
Database
↑
Model
↑
Controller
↓
View
↓
Người dùng
Đọc từ trên xuống.
Rồi từ dưới lên.
Là hiểu được cơ bản MVC.
Ví dụ với website bán sách
Bạn truy cập:
/books
Controller nhận request.
↓
$books = Book::all();
Model.
↓
Lấy dữ liệu từ Database.
↓
Controller nhận danh sách sách.
↓
Gửi sang View.
↓
View hiển thị:
PHP cho người mới
150.000đ
MySQL cơ bản
120.000đ
Laravel từ A-Z
250.000đ
Người dùng nhìn thấy.
Nếu không dùng MVC thì sao?
Đây mới là phần thú vị.
Hãy tưởng tượng.
Bạn có một file rất "hoành con bà tráng":
index.php
Trong đó có:
<?php
// Kết nối Database
// Kiểm tra đăng nhập
// Query sản phẩm
// Tính giá
// Xử lý đơn hàng
// HTML
// CSS
// JavaScript
// In dữ liệu
// Gửi email
// ...
?>
Ban đầu.
Website có 100 dòng.
Không sao.
Một tháng sau.
500 dòng.
Ba tháng sau.
2.000 dòng.
Một năm sau.
10.000 dòng.
Một ngày Thu lá vàng rơi...bạn mở file.
Và "cay đắng" tự hỏi:
"Ai đã viết mớ hổ lốn này?"
...
Chính bạn.
Đây chính là lý do MVC ra đời
MVC giúp chia công việc.
Không để tất cả mọi thứ.
Nhét vào một file.
Model.
↓
Lo dữ liệu.
View.
↓
Lo giao diện.
Controller.
↓
Điều phối.
Mỗi người.
Một việc.
Nhà hàng cũng vậy.
Không thể để:
- Đầu bếp.
- Thu ngân.
- Nhân viên.
- Bảo vệ.
Cùng "đứng tên" trong một nồi phở.
Một hiểu lầm rất "viral"
Nhiều người nghĩ:
"MVC nghĩa là website chỉ có đúng 3 file."
Không hề như vậy.
MVC là mô hình tổ chức code.
Một ứng dụng có thể có:
- 100 Models
- 50 Controllers
- 200 Views
Hoàn toàn bình thường.
MVC không nói:
"Chỉ được có 3 file."
Nó nói:
"Hãy phân chia trách nhiệm cho hợp lý."
Laravel và MVC
Laravel.
Là Framework.
Và Laravel hỗ trợ kiến trúc MVC rất mạnh.
Ví dụ:
app/
|-- Models/
| --- Product.php
|
| -- Http/
|--- Controllers/
|----- ProductController.php
resources/
|--views/
|--- products/
|---- index.blade.php
Nhìn hơi nhiều file.
Nhưng khi dự án lớn.
Bạn sẽ thấy:
"May quá, nó được chia ra."
MVC không chỉ dành cho Laravel
Dĩ nhiên là không.
MVC xuất hiện trong rất nhiều Framework và ứng dụng web.
Ví dụ:
PHP.
--> Laravel, Symfony...
Python.
--> Django và các kiến trúc tương tự.
Ruby.
--> Ruby on Rails.
...
Tên gọi và cách triển khai có thể khác nhau.
Nhưng ý tưởng chung vẫn là:
Tách trách nhiệm.
MVC có làm website nhanh hơn không?
Không trực tiếp.
MVC không phải:
"Bật MVC lên là website chạy nhanh gấp 10 lần."
Mục tiêu chính là:
- Code rõ ràng hơn.
- Dễ bảo trì.
- Dễ debug.
- Dễ làm việc nhóm.
- Dễ mở rộng.
InfinityFree Case
Giả sử website PHP miễn phí của bạn có lỗi.
Bạn thấy:
Undefined variable
Bạn mở View.
Không thấy.
Mở Model.
Cũng không thấy.
Cuối cùng.
Bạn kiểm tra Controller.
Tìm ra:
Controller chưa truyền biến sang View.
Ví dụ:
return view('products', [
'products' => $products
]);Bạn quên:
'products' => $products
View chờ dữ liệu.
Controller không đưa.
Thế là.
View...
đói dữ liệu.
Debug MVC kiểu dev "xịn"
Khi một trang bị lỗi.
Đừng lập tức sửa lung tung.
Hãy hỏi:
1. Request có tới Controller không?
Nếu không.
Kiểm tra:
Route.
2. Controller có gọi Model không?
Nếu không.
Kiểm tra:
Controller.
3. Model có lấy được Database không?
Nếu không.
Kiểm tra:
Model / Database.
4. Controller có truyền dữ liệu sang View không?
Nếu không.
Sửa:
Controller.
5. View có hiển thị đúng dữ liệu không?
Nếu không.
Kiểm tra:
View.
Đây chính là tư duy debug rất quan trọng.
Thay vì:
"Website lỗi!"
Bạn hỏi:
"Lỗi đang nằm ở tầng nào?"
Một mẹo cực "đỉnh"
Khi học MVC.
Đừng cố học thuộc:
- Model là gì?
- View là gì?
- Controller là gì?
Hãy nhớ bằng câu chuyện:
Controller nhận order.
↓
Model lấy dữ liệu.
↓
View mang món ra.
Chỉ vậy thôi.
Sau này gặp Laravel.
Bạn sẽ tự nối được các khái niệm.
"Chua thêm" ...một nhà hàng
MVC là gì?
Là khi bạn không muốn:
"Một file PHP làm đầu bếp, thu ngân, phục vụ, bảo vệ và luôn cả... rửa chén."
MVC bảo:
"Mỗi người làm một việc đi!"
Model:
"Tôi lo Database."
View:
"Tôi lo giao diện."
Controller:
"Tôi điều phối."
Và Developer:
"Cuối cùng tôi cũng tìm được code mình cần sửa."
Checklist chuẩn không cần chỉnh
- MVC = Model + View + Controller
- Model xử lý dữ liệu
- View hiển thị giao diện
- Controller điều phối
- MVC giúp code dễ bảo trì
- MVC không phải là một ngôn ngữ lập trình
- Laravel sử dụng mạnh kiến trúc MVC
- Khi debug, hãy xác định lỗi nằm ở tầng nào
FAQ nhanh
MVC có phải Framework không?
Không. MVC là một mô hình tổ chức ứng dụng. Framework như Laravel có thể sử dụng MVC để tổ chức code.
Model có phải chính là Database không?
Không. Model là lớp làm việc với dữ liệu và thường giao tiếp với Database.
View có xử lý Database không?
Theo cách tổ chức MVC tốt, View nên tập trung vào việc hiển thị, không nên chứa logic Database phức tạp.
Controller có phải làm tất cả không?
Không. Controller nên điều phối yêu cầu, gọi Model và chọn View phù hợp. Nếu Controller dài hàng nghìn dòng thì có thể bạn đang nhét quá nhiều việc vào một chỗ.
Có bắt buộc mọi website PHP phải dùng MVC không?
Không. Website PHP nhỏ hoàn toàn có thể dùng PHP thuần mà không cần MVC. MVC đặc biệt hữu ích khi dự án lớn dần và cần tổ chức code rõ ràng.
Bạn có thể cũng đang gặp
Framework là gì? (Tại sao ai cũng thích dùng Laravel thay vì viết mọi thứ từ đầu?)
API là gì? (Giải thích như gọi đồ ăn.)
include, require, include_once và require_once khác nhau thế nào?
Session vs Cookie - Hai anh em dễ nhầm nhất của PHP
White Screen of Death – Trang trắng xóa không báo lỗi
localhost vs hosting khác nhau thế nào?