Mẫu HMVC là gì?


130

Đọc tài liệu của Kohana, tôi phát hiện ra rằng sự khác biệt chính trong phiên bản 3.0 là nó tuân theo mô hình HMVC thay vì MVC như phiên bản 2.x. Trang về điều này trong các tài liệu của Kohana và trang trên wikipedia thực sự không cho tôi một ý tưởng rõ ràng.

Vì vậy, câu hỏi: mô hình HMVC là gì và nó khác với MVC như thế nào?


30
Một cuộc thảo luận về chính chủ đề này đã diễn ra trong các diễn đàn Kohana. Bạn có thể tìm thấy sự giúp đỡ: forum.kohanaframework.org/discussion/1681
Sampson

Câu trả lời:


86

Sam de Freyssinet (một trong những nhà phát triển Kohana) đã viết một bài viết khá chuyên sâu về HMVC , nó là gì và làm thế nào để sử dụng nó.

Liên kết đã chết: Liên kết mới - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-appluggest-with-hmvc/


cảm ơn vì một liên kết tốt, đồng thời kiểm tra javaworld.com/jw-07-2000/jw-0721-hmvc.html
Owais Qureshi


Liên kết luôn luôn sẽ chết! đăng nội dung thay vì liên kết.
Loki

58

Tôi hiện đang trong quá trình phát triển khung công tác PHP 5.3 HMVC của riêng mình có tên là Alloy . Vì tôi được đầu tư rất nhiều vào và bán trên HMVC, tôi nghĩ rằng tôi có thể đưa ra một quan điểm khác, và có lẽ là một lời giải thích tốt hơn về lý do tại sao nên sử dụng HMVC và lợi ích mà nó mang lại.

Lợi ích thực tế lớn nhất của việc sử dụng kiến ​​trúc HMVC là "phụ kiện hóa" các cấu trúc nội dung. Một ví dụ có thể là bình luận, xếp hạng, hiển thị nguồn cấp dữ liệu RSS hoặc blog hoặc hiển thị nội dung giỏ hàng cho một trang web thương mại điện tử. Nó thực chất là một phần nội dung cần được hiển thị trên nhiều trang và thậm chí có thể ở những nơi khác nhau, tùy thuộc vào ngữ cảnh của yêu cầu HTTP chính.

Các khung MVC truyền thống thường không cung cấp câu trả lời trực tiếp cho các loại cấu trúc nội dung này, vì vậy mọi người thường kết thúc việc sao chép và chuyển đổi bố cục, sử dụng trình trợ giúp tùy chỉnh, tạo cấu trúc widget hoặc tệp thư viện của riêng họ hoặc lấy dữ liệu không liên quan từ yêu cầu chính Bộ điều khiển để đẩy qua Chế độ xem và hiển thị một phần. Không có lựa chọn nào trong số này là các tùy chọn đặc biệt tốt, bởi vì trách nhiệm hiển thị một phần nội dung cụ thể hoặc tải dữ liệu cần thiết cuối cùng bị rò rỉ vào nhiều khu vực và bị trùng lặp ở những nơi nó được sử dụng.

HMVC, hay cụ thể là khả năng gửi các yêu cầu phụ đến Bộ điều khiển để xử lý các trách nhiệm này là giải pháp rõ ràng. Nếu bạn nghĩ về những gì bạn đang làm, nó phù hợp với cấu trúc Bộ điều khiển chính xác. Bạn cần tải một số dữ liệu về nhận xét và hiển thị chúng ở định dạng HTML. Vì vậy, bạn gửi yêu cầu tới Trình điều khiển nhận xét với một số thông số, nó tương tác với Mô hình, chọn Chế độ xem và Chế độ xem hiển thị nội dung. Sự khác biệt duy nhất là bạn muốn các bình luận được hiển thị nội tuyến, bên dưới bài viết blog mà người dùng đang xem thay vì trang bình luận đầy đủ hoàn toàn riêng biệt (mặc dù với cách tiếp cận HMVC, bạn thực sự có thể phục vụ cả yêu cầu bên trong và bên ngoài với cùng một bộ điều khiển và "giết hai con chim với một hòn đá ", như người ta vẫn nói). Về vấn đề này, HMVC thực sự chỉ là một sản phẩm phụ tự nhiên của việc phấn đấu tăng tính mô đun mã, khả năng sử dụng lại và duy trì sự phân tách tốt hơn các mối quan tâm. Đây là điểm bán hàng của HMVC.

Vì vậy, trong khi bài viết về TechPortal của Sam de Freyssinet về nhân rộng với HMVC rất thú vị để suy nghĩ, thì đó không phải là nơi mà 90% những người sử dụng khung HMVC sẽ nhận được lợi ích thực tế, hàng ngày từ nó.


5
Vâng, đây là cách tôi tưởng tượng nó trong sử dụng trong thế giới thực, nhưng từ quan điểm này, cái tên không hoàn toàn phù hợp vì chữ H trong HMVC bị sai lệch (không có thứ bậc thực sự).
Matteo Riva

2
Vâng, bạn làm cho một điểm tốt. Tôi thực sự chia sẻ quan điểm này và cho nó một cái tên khác - "Nested MVC" - trong một bài thuyết trình tôi đã làm trên hợp kim tại Confoo 2011. Đó là lên trên SlideShare, trượt # 20: slideshare.net/vlucas/alloy-hmvc-php- khuôn khổ
Vance Lucas

Làm thế nào HMVC sẽ xử lý nhu cầu trả lại nhiều từ cây mô-đun? Ví dụ, đối chiếu nội dung head / body / footer, phụ thuộc JS / Css và mối liên hệ giữa các mô-đun. Sự kiện? Móc? Một khung trang đơn? Cấu trúc trả về đối tượng?
scipilot 15/2/2015

1
Câu trả lời này là một bản sao của wikipedia: / en.wikipedia.org/wiki/ từ
EricG

3
@EricG trông giống như ai đó đã sao chép câu trả lời tôi đưa ra ở đây, sau đó thêm nó vào Wikipedia (không phải là tôi). Kiểm tra phần "Tài liệu tham khảo" ở cuối bài viết Wikipedia - nó liên kết lại với bình luận này.
Vance Lucas

7

HMVC liên quan chặt chẽ đến cách tiếp cận "dựa trên thành phần" để điều phối. Về cơ bản, thay vì có một bộ điều phối, ủy nhiệm cho bộ điều khiển, mỗi bộ điều khiển có thể hoạt động như một bộ điều phối. Điều này cung cấp cho bạn một hệ thống phân cấp của bộ điều khiển. Thiết kế linh hoạt hơn và gây ra sự đóng gói mã tốt hơn, nhưng với mức giá trừu tượng cao hơn. Konstrukt được thiết kế xung quanh mẫu này.

Xem thêm câu trả lời này: /programming/115629/simplest-php-routing-framework/120411#120411


7

Ở Kohana, ít nhất, một yêu cầu HMVC là một yêu cầu HTTP được phục vụ "nội bộ": thay vì được phát hành qua mạng, nó được định tuyến, gửi đi và xử lý bởi chính khung công tác. Sự giống nhau của tên "HMVC" và "MVC" gây nhầm lẫn ở chỗ nó gợi ý một mối liên hệ cơ bản giữa các thuật ngữ không tồn tại trên thực tế: một không phải là một biến thể nhỏ hoặc sửa đổi của cái khác, chúng là những thứ hoàn toàn khác nhau. (HMVC cũng được mô tả là Ajax mà không có yêu cầu HTTP phía máy khách.) Sự nhấn mạnh của Kohana và hỗ trợ cho "HMVC" có nghĩa là khung này hỗ trợ mạnh mẽ cho kiến ​​trúc hướng dịch vụ dựa trên HTTP.

Ưu điểm của mẫu kiến ​​trúc này là do cùng một "quy ước gọi" được sử dụng cho các yêu cầu bên trong và bên ngoài, nên việc chuyển đổi các yêu cầu dịch vụ "nội bộ" thành các yêu cầu "bên ngoài" hoặc ngược lại khi có nhu cầu.

Mặc dù đây là một mẫu kiến ​​trúc hợp lý, việc đặt tên riêng của nó dường như không cần thiết (Symfony2 mô tả cùng một khái niệm " yêu cầu phụ ") và trên thực tế, tên này có vẻ là một cách hiểu sai: không có yêu cầu cụ thể hoặc yêu cầu nào tạo thành yêu cầu hệ thống phân cấp (khác với biểu đồ cuộc gọi tiêu chuẩn của mọi chương trình bắt buộc); các yêu cầu có thể dễ dàng được đệ quy, ví dụ.

[ Cập nhật tháng 4 năm 2011, tháng 3 năm 2012: Mở rộng về câu trả lời để phản hồi các bình luận.]


2
Có thể chuyển đổi các yêu cầu dịch vụ 'nội bộ' sang các yêu cầu 'bên ngoài' mà bạn có thể mở rộng dễ dàng hơn nếu được yêu cầu, tức là chuyển một số mô-đun ứng dụng sang máy chủ của riêng họ.
Kim Hoàng tử

1
vâng, hãy thử triển khai một dịch vụ web nội bộ với nó và không có nó, chỉ để xem liệu nó có thực sự "không thực sự quan trọng đến thế không".
Kemo

@Kemo Tôi nghĩ đó là một kiến ​​trúc tốt, tôi chỉ nghĩ rằng cái tên này khó hiểu và nó ám chỉ rằng Kohana đang làm một cái gì đó đặc biệt khác thường.
mjs

Tôi không chắc câu trả lời của bạn hữu ích như thế nào. Bạn không trả lời câu hỏi chỉ phàn nàn về tên và điều đó là không cần thiết (điều đó tốt).
Dave

4

HMVC là Trình điều khiển Chế độ xem mô hình phân cấp. Trong MVC bình thường, mọi đối tượng GUI đều có MVC. Nhưng không có bất kỳ mối quan hệ nào giữa đối tượng GUI cha và đối tượng GUI con không giống như HMVC. Trong HMVC, mỗi đối tượng GUI có quyền truy cập vào các đối tượng con của nó và mỗi đối tượng con có thể truy cập vào đối tượng cha của nó.

Vì vậy, trong mỗi chế độ xem đều có chế độ xem chính. Thông qua đó có thể truy cập chế độ xem chính. Đối với mọi bộ điều khiển đều có bộ điều khiển chính thông qua đó Nó có thể truyền sự kiện cho bộ điều khiển chính (Nếu sự kiện không nằm trong phạm vi của nó.)

Để biết chi tiết mô tả xin vui lòng bấm vào đây

Liên kết mới là địa chỉ này


1
dấu hiệu của một câu trả lời tốt không chỉ là một liên kết không có thông tin hoặc bối cảnh khác. Xin vui lòng bạn có thể dành câu trả lời của bạn và tóm tắt phần có liên quan của bài viết được liên kết?
Kev

1
@Sanjay, lý do nào khiến bạn thay đổi đích của liên kết từ bài viết của HMVC sang một trong trạng thái gwt cho thiết bị di động?
Brad Koch

@ Koch..Tôi không thay đổi liên kết ... thậm chí tôi không biết ai đã thay đổi nó .... btw Tôi đã liên kết nó với liên kết ban đầu.
Sanjay Jain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.