Что такое шаблон HMVC? - PullRequest
       23

Что такое шаблон HMVC?

128 голосов
/ 15 февраля 2010

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

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

Ответы [ 5 ]

86 голосов
/ 01 марта 2010

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

Ссылка не работает: новая ссылка - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/

58 голосов
/ 21 апреля 2011

Я сейчас нахожусь в процессе разработки моей собственной PHP 5.3 HMVC-фреймворка под названием Alloy . Поскольку я вложил значительные средства в HMVC и продал его, я подумал, что могу предложить другую точку зрения и, возможно, лучшее объяснение того, почему следует использовать HMVC и какие преимущества он приносит.

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

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

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

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

7 голосов
/ 06 июля 2010

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

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

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

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

7 голосов
/ 15 февраля 2010

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

Смотрите также этот ответ: https://stackoverflow.com/questions/115629/simplest-php-routing-framework/120411#120411

4 голосов
/ 07 июня 2011

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

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

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

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

...