Что такое паттерн HMVC?


130

Читая документацию Kohana, я обнаружил, что основное отличие версии 3.0 заключается в том, что она следует шаблону HMVC, а не MVC, как это делает версия 2.x. Страница об этом в документации Коханы и страница в Википедии на самом деле не дали мне четкого представления.

Итак, вопрос: что такое шаблон HMVC и чем он отличается от MVC?


30
Обсуждение именно этой темы проходило на форумах Kohana. Возможно, вам это пригодится
Sampson

Ответы:


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 является «виджетизация» структур контента. Примером могут быть комментарии, рейтинги, отображение RSS-канала Twitter или блога или отображение содержимого корзины покупок для веб-сайта электронной коммерции. По сути, это фрагмент контента, который необходимо отображать на нескольких страницах и, возможно, даже в разных местах, в зависимости от контекста основного HTTP-запроса.

Традиционные фреймворки MVC обычно не дают прямого ответа для этих типов структур контента, поэтому люди обычно в конечном итоге дублируют и переключают макеты, используют настраиваемые помощники, создают свои собственные структуры виджетов или файлы библиотеки или извлекают несвязанные данные из основного запрошенного Контроллер для перехода к представлению и частичного рендеринга. Ни один из этих вариантов не является особенно хорошим, потому что ответственность за рендеринг определенного фрагмента контента или загрузку требуемых данных заканчивается утечкой в ​​несколько областей и дублированием в тех местах, где они используются.

HMVC или, в частности, возможность отправлять подзапросы контроллеру для выполнения этих обязанностей - очевидное решение. Если вы думаете о том, что делаете, это точно соответствует структуре контроллера. Вам необходимо загрузить некоторые данные о комментариях и отобразить их в формате HTML. Итак, вы отправляете запрос контроллеру комментариев с некоторыми параметрами, он взаимодействует с моделью, выбирает представление, а представление отображает содержимое. Единственная разница в том, что вы хотите, чтобы комментарии отображались встроенными под статьей блога, которую просматривает пользователь, а не на полностью отдельной странице с полными комментариями (хотя с подходом HMVC вы можете фактически обслуживать как внутренние, так и внешние запросы с одним и тем же контроллером и "kill два зайца одним выстрелом », как говорится). В этой связи, HMVC - это просто естественный побочный продукт стремления к повышенной модульности кода, возможности повторного использования и поддержанию лучшего разделения проблем. ЭТО - точка продажи HMVC.

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


5
Да, именно так я представлял себе это в реальном мире, но с этой точки зрения название не совсем подходит, так как H в HMVC вводит в заблуждение (реальной иерархии нет).
Маттео Рива,

2
Да, вы правильно подметили. Я действительно разделяю эту точку зрения и дал ей другое название - «Вложенный MVC» - в презентации, которую я сделал на Alloy на Confoo 2011. Он размещен на Slideshare, слайд № 20: slideshare.net/vlucas/alloy-hmvc-php- framework
Вэнс Лукас

Как HMVC справится с необходимостью многократного возврата из дерева модулей? Например, сопоставление содержимого заголовка / тела / нижнего колонтитула, зависимостей JS / Css и взаимосвязей между модулями. События? Крючки? Структура одноэлементной страницы? Структурированные объекты возврата?
scipilot

1
Этот ответ является копией википедии: / en.wikipedia.org/wiki/…
EricG

3
@EricG выглядит так, будто кто-то скопировал ответ, который я здесь дал, а затем добавил его в Википедию (это был не я). Проверьте раздел «Ссылки» внизу статьи в Википедии - там есть обратные ссылки на этот комментарий.
Вэнс Лукас,

7

HMVC тесно связан с "компонентным" подходом к диспетчеризации. По сути, вместо одного диспетчера, который делегирует полномочия контроллеру, каждый контроллер может сам действовать как диспетчер. Это дает вам иерархию контроллеров. Дизайн более гибкий и обеспечивает лучшую инкапсуляцию кода, но за счет более высокой абстракции. Konstrukt разработан на основе этого шаблона.

См. Также этот ответ: /programming/115629/simplest-php-routing-framework/120411#120411


7

В Kohana, по крайней мере, запрос HMVC - это HTTP-запрос, который обслуживается «внутри»: вместо того, чтобы отправляться по сети, он маршрутизируется, отправляется и обрабатывается самой структурой. Сходство названий «HMVC» и «MVC» сбивает с толку, поскольку предполагает основополагающую связь между терминами, которой фактически не существует: один не является второстепенным вариантом или модификацией другого, это совершенно разные вещи. (HMVC также описывается как Ajax без HTTP-запроса на стороне клиента.) Акцент Kohana и поддержка «HMVC» означает, что структура имеет сильную поддержку сервис-ориентированной архитектуры на основе HTTP.

Преимущество этого архитектурного паттерна состоит в том, что, поскольку для внутренних и внешних запросов используется одно и то же «соглашение о вызовах», преобразовать «внутренние» сервисные запросы во «внешние» запросы или наоборот по мере необходимости тривиально.

Хотя это разумный архитектурный шаблон, давать ему собственное имя кажется излишним (Symfony2 описывает ту же концепцию « подзапросы »), и на самом деле имя кажется неправильным: нет особого требования или необходимости, чтобы запросы формировали иерархия (кроме стандартного графа вызовов каждой императивной программы); например, запросы могут легко быть рекурсивными.

[ Обновление, апрель 2011 г., март 2012 г.: ответ расширен в ответ на комментарии.]


2
Имея возможность преобразовывать «внутренние» сервисные запросы во «внешние» запросы, вы можете более легко масштабировать, если требуется, то есть переместить некоторые модули приложения на их собственный сервер.
Kim Prince

1
да, попробуйте реализовать внутренний веб-сервис с ним и без него, просто чтобы посмотреть, действительно ли это «не так уж важно».
Кемо

@Kemo Я считаю, что это прекрасная архитектура, я просто думаю, что название сбивает с толку и подразумевает, что Кохана делает что-то особенно необычное.
mjs

Я не уверен, насколько полезен ваш ответ. Вы не отвечаете на вопрос, просто жалуясь на имя и на то, что в нем нет необходимости (и это нормально).
Дэйв

4

HMVC - это контроллер представления иерархической модели. В обычном MVC каждый объект GUI имеет свой MVC, но в отличие от HMVC, нет никакой связи между родительским объектом GUI и дочерним объектом GUI. В HMVC каждый объект GUI имеет доступ к своим дочерним объектам, и каждый дочерний объект может получить доступ к своему родительскому объекту.

Таким образом, в каждом представлении есть родительский вид, через который он может получить к нему доступ. Ведь в каждом контроллере есть родительский контроллер, через который он может передать событие родительскому контроллеру (если событие не входит в его область действия).

Для подробного описания нажмите здесь

Новая ссылка - этот адрес


1
Признак хорошего ответа - это не просто ссылка без другой информации или контекста. Не могли бы вы развернуть свой ответ и резюмировать соответствующую часть связанного сообщения?
Кев

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

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