Що таке модель HMVC?


130

Читаючи документацію Кохани, я виявив, що головна відмінність версії 3.0 полягає в тому, що вона відповідає схемі HMVC замість MVC, як це робить версія 2.x. Сторінка про це в документах Кохани та вікіпедія насправді не дали мені чіткого уявлення.

Тож запитайте: що таке HMVC та чим він відрізняється від MVC?


30
Дискусія на цю саму тему відбулася на форумах Кохани. Можливо, вам це допоможе: forum.kohanaframework.org/discussion/1681
Сампсон

Відповіді:


86

Сам де Фрейсінет (один із розробників Kohana) написав досить глибоку статтю про HMVC , що це таке, і як ним можна користуватися.

Посилання мертве: Нове посилання - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/


спасибі за гарне посилання, також замовіть
Овайс Куреші


Посилання завжди помруть! розмістити вміст замість посилання.
Локі

58

На даний момент я розробляю власну структуру PHP 5.3 HMVC під назвою Alloy . Оскільки я дуже інвестую в HMVC і продаю його, я подумав, що можу запропонувати іншу точку зору, і, можливо, краще пояснення, чому слід використовувати HMVC та користь, яку він приносить.

Найбільша практична вигода від використання архітектури HMVC - це "widgetilization" змістових структур. Прикладом можуть бути коментарі, рейтинги, покази RSS-каналів Twitter або блогу або відображення вмісту кошика для веб-сайту електронної комерції. По суті, це вміст, який потрібно відображати на декількох сторінках, а можливо, навіть у різних місцях, залежно від контексту основного запиту HTTP.

Традиційні рамки MVC зазвичай не дають прямої відповіді на такі типи контентних структур, тому люди зазвичай закінчують дублювання та перемикання макетів, використовуючи власні помічники, створюючи власні структури віджетів або бібліотечні файли або витягуючи непов'язані дані з основних запитуваних Контролер, щоб просунутись до виду і частково вивести. Жоден із них не є особливо хорошими варіантами, оскільки відповідальність за надання певного вмісту або завантаження необхідних даних закінчується просоченням у декілька областей та дублюванням у місцях його використання.

Очевидним рішенням є HMVC, або конкретно можливість відправки суб-запитів до Контролера для виконання цих обов'язків. Якщо ви думаєте, що ви робите, це точно відповідає структурі контролера. Вам потрібно завантажити деякі дані про коментарі та відобразити їх у форматі HTML. Таким чином, ви надсилаєте запит до Контролера коментарів з деякими парамами, він взаємодіє з Моделлю, вибирає перегляд, і Перегляд відображає вміст. Єдина відмінність полягає в тому, що ви хочете, щоб коментарі відображалися вбудованими, під статтею блогу користувач переглядає замість повністю окремої повної сторінки коментарів (хоча при підході HMVC ви можете фактично обслуговувати як внутрішні, так і зовнішні запити одним і тим же контролером і "убивати" дві птиці з одним каменем », як мовиться). Щодо цього, HMVC - це справді природний побічний продукт, що прагне до підвищення модульності коду, повторної використання та підтримання кращого розділення проблем. ЦЕ є торговою точкою HMVC.

Тож хоча в статті TechPortal Сем де Фрейссінета про масштабування за допомогою HMVC цікаво подумати, це не де 90% + людей, які використовують рамки HMVC, отримуватимуть від цього реальну, практичну та щоденну вигоду.


5
Так, це я уявив це в реальному використанні, але з цієї точки зору назва не зовсім підходить, оскільки Н у HMVC вводить в оману (реальної ієрархії немає).
Маттео Ріва

2
Так, ви добре зазначаєте. Я фактично поділяю цю точку зору і дав їй іншу назву - "Вкладений MVC" - у презентації, яку я робив на Alloy на Confoo 2011. Це на Slideshare, слайд №20: slideshare.net/vlucas/alloy-hmvc-php- фреймворк
Vance Lucas

Як HMVC впорається з потребою в декількох поверненнях з дерева модулів? Наприклад, вміст голови / тіла / колонтитула, залежності JS / Css та взаємозв'язок між модулями. Події? Гачки? Однотонна рамка сторінки? Структуровані об'єкти повернення?
вчений пілот

1
Ця відповідь є копією wikipedia: / en.wikipedia.org/wiki/…
EricG

3
@EricG схоже, що хтось скопіював відповідь, яку я дав тут, а потім додав її до Вікіпедії (це не я). Перевірте розділ «Посилання» внизу статті у Вікіпедії - він посилається на цей коментар.
Ванс Лукас

7

HMVC тісно пов'язаний з "компонентним" підходом до диспетчеризації. В основному, замість того, щоб мати одного диспетчера, який делегує контролеру, кожен контролер може діяти як диспетчер. Це дає вам ієрархію контролерів. Конструкція є більш гнучкою і спричиняє кращу інкапсуляцію коду, але ціною вищої абстракції. Конструкт розроблений за цією схемою.

Дивіться також цю відповідь: /programming/115629/simplest-php-routing-framework/120411#120411


7

Принаймні, у Кохані запит HMVC - це запит HTTP, який обслуговується "внутрішньо": замість того, щоб видаватись по мережі, він спрямовується, відправляється та обробляється самим фреймворком. Подібність назв "HMVC" та "MVC" є заплутаною в тому, що вона пропонує основний зв'язок між термінами, які насправді не існують: один не є другорядним варіантом чи модифікацією іншого, вони є абсолютно різними речами. (HMVC також описується як Ajax без HTTP-запиту на стороні клієнта.) Наголос Кохани на підтримці "HMVC" означає, що система підтримує структуру, орієнтовану на HTTP, орієнтовану на сервіс.

Перевага цього архітектурного шаблону полягає в тому, що однакова «конвенція про виклики» використовується для внутрішніх і зовнішніх запитів, тривіально перетворювати «внутрішні» запити на послуги у «зовнішні» запити або навпаки, у міру виникнення потреби.

Хоча це є розумною архітектурною схемою, присвоєння їй власного імені видається непотрібним (Symfony2 описує те саме поняття " підзапити "), а насправді ім'я здається помилковим: немає особливих вимог чи потреби, щоб запити формували ієрархія (крім стандартної графіки викликів кожної імперативної програми); наприклад, запити можуть бути рекурсивними, наприклад.

[ Оновлення квітня 2011 р., Березень 2012 р .: Розгорнуто відповідь у відповідь на коментарі.]


2
Здійснюючи можливість перетворення "внутрішніх" запитів на послуги до "зовнішніх" запитів, ви можете простіше масштабувати, якщо потрібно, тобто перемістити деякі модулі додатків на власний сервер.
Кім-принц

1
так, спробуйте впровадити внутрішню веб-службу з нею і без неї, просто щоб побачити, чи це насправді "насправді не так важливо".
Kemo

@Kemo Я думаю, що це прекрасна архітектура, я просто вважаю, що це назва заплутане, і це означає, що Кохана робить щось особливо незвичне.
міс

Я не впевнений, наскільки ваша відповідь корисна. Ви не відповідаєте на питання, просто нарікаєте на ім’я та на те, що це непотрібно (що нормально).
Дейв

4

HMVC є контролером ієрархічної моделі перегляду. У звичайному MVC у кожного об’єкта GUI є свій MVC. Але між батьківським об’єктом GUI та дочірнім GUI-об'єктом немає ніякого відношення на відміну від HMVC. У HMVC кожен об’єкт GUI має доступ до своїх дочірніх об'єктів, і кожен з дочірніх об'єктів може отримати доступ до свого батьківського об'єкта.

Таким чином, у кожному огляді є батьківський вигляд. Через нього він може отримати доступ до батьківського подання. Бо в кожному контролері є батьківський контролер, за допомогою якого Він може передати подію батьківському контролеру (Якщо подія не входить у його сферу застосування.)

Для детального опису натисніть тут

Нове посилання - це адреса


1
ознака хорошої відповіді - це не просто посилання на відсутність іншої інформації чи контексту. Будь ласка, можете витратити свою відповідь та підсумувати відповідну частину пов’язаної публікації?
Кев

1
@Sanjay, будь-яка причина ви змінили призначення посилання зі статті HMVC на інше про стан gwt для мобільних пристроїв?
Бред Кох

@ Koch..Я не змінив посилання ... навіть я не знаю, хто його змінив .... btw Я зв'язав його з оригінальним посиланням.
Санджай Джайн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.