Lưu ý: Robert C. Martin (còn gọi là chú Bob) giải thích điều này theo cách hài hước và hay hơn nhiều trong bài phát biểu của mình, Architecture the Lost Years . Một chút dài nhưng dạy rất nhiều khái niệm tốt.
tl; dr: Đừng suy nghĩ và lập kế hoạch cho ứng dụng của bạn theo MVC. Khung MVC chỉ là một chi tiết triển khai.
Điều khó hiểu nhất về MVC là, các nhà phát triển cố gắng sử dụng tất cả các thành phần được dán lại với nhau.
Hãy thử suy nghĩ trong các điều khoản của một chương trình, không phải trong các điều khoản của khung.
Chương trình của bạn có một mục đích. Nó lấy một số dữ liệu, thực hiện mọi thứ với dữ liệu và trả về một số dữ liệu.
Bằng cách đó, controller
cơ chế phân phối của chương trình của bạn.
- Một người dùng gửi yêu cầu đến chương trình của bạn (giả sử, thêm một sản phẩm vào giỏ hàng).
- Bộ điều khiển nhận yêu cầu đó (thông tin sản phẩm và thông tin người dùng), nó gọi phần cần thiết trong chương trình của bạn sẽ xử lý yêu cầu này
$user->addToCart($product)
- Chương trình của bạn (
addToCart
chức năng của user
đối tượng trong trường hợp này) thực hiện công việc mà nó dự định thực hiện và trả về phản hồi (giả sử success
)
- Bộ điều khiển chuẩn bị phản hồi bằng cách sử dụng có liên quan
view
: vd. trong đối tượng điều khiển$this->render($cartView('success')
Bằng cách này, các bộ điều khiển được tách rời khỏi chương trình và được sử dụng làm cơ chế phân phối. Họ không biết chương trình của bạn hoạt động như thế nào, họ chỉ biết phần nào của chương trình cần được gọi cho các yêu cầu.
Nếu bạn muốn sử dụng một khung công tác khác, ứng dụng của bạn sẽ không cần thay đổi, bạn sẽ chỉ cần viết các bộ điều khiển có liên quan để gọi chương trình của bạn cho các yêu cầu.
Hoặc nếu bạn muốn tạo một phiên bản máy tính để bàn, ứng dụng của bạn sẽ giữ nguyên, bạn chỉ cần chuẩn bị một cơ chế phân phối.
Và Model
. Hãy nghĩ về nó như một cơ chế bền bỉ.
Theo cách OO, có các đối tượng trong chương trình của bạn chứa dữ liệu.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
Khi bạn thêm một sản phẩm vào giỏ hàng, bạn có thể thêm sản phẩm product::id
vào user::shoppingCart
.
Và khi bạn muốn duy trì dữ liệu, bạn có thể sử dụng model
một phần của khung, thường bao gồm sử dụng ORM, để ánh xạ các lớp vào các bảng cơ sở dữ liệu.
Nếu bạn muốn thay đổi ORM bạn sử dụng, chương trình của bạn sẽ giữ nguyên, chỉ có thông tin ánh xạ sẽ thay đổi. Hoặc nếu bạn muốn tránh tất cả các cơ sở dữ liệu cùng nhau, bạn chỉ cần ghi dữ liệu vào các tệp văn bản thuần túy và ứng dụng của bạn sẽ giữ nguyên.
Vì vậy, viết chương trình của bạn đầu tiên. Nếu bạn lập trình theo cách 'OO', hãy sử dụng các đối tượng cũ đơn giản của ngôn ngữ. Đừng nghĩ về mặt MVC lúc đầu.