HMVCパターンとは何ですか?


130

Kohanaのドキュメントを読んで、3.0バージョンの主な違いは、バージョン2.xのようにMVCではなくHMVCパターンに従うことです。コハナのドキュメントのこのページとウィキペディアのページは、私に明確なアイデアを与えませんでした。

だから質問:HMVCパターンとは何ですか?それはMVCとどう違うのですか?


30
このトピックに関するディスカッションは、コハナフォーラム内で行われました。あなたはそれが助けになるかもしれません:forum.kohanaframework.org/discussion/1681
サンプソン

回答:


86

Sam de Freyssinet(Kohana開発者の1人)は、HMVCとは何か、それがどのように使用できるかについて、かなり詳細な記事を書きました。

リンクが死んでいる:新しいリンク-https : //web.archive.org/web/20160214073806/http : //techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/


良いリンクに感謝します。また、このjavaworld.com/jw-07-2000/jw-0721-hmvc.html
Owais Qureshi


リンクは常に死にます!リンクの代わりにコンテンツを投稿します。
ロキ

58

現在、Alloyと呼ばれる独自のPHP 5.3 HMVCフレームワークを開発中です。私はHMVCに多額の投資と販売を行っているので、別の見方をすることができ、HMVCを使用する理由とHMVCがもたらすメリットをよりよく説明できると思いました。

HMVCアーキテクチャを使用する最大の実用的な利点は、コンテンツ構造の「ウィジェット化」です。たとえば、コメント、評価、TwitterまたはブログのRSSフィードの表示、eコマースWebサイトのショッピングカートコンテンツの表示などです。これは基本的に、メインのHTTPリクエストのコンテキストに応じて、複数のページにまたがって異なる場所に表示する必要があるコンテンツの一部です。

従来のMVCフレームワークは通常、これらのタイプのコンテンツ構造に直接的な回答を提供しないため、一般的に人々はレイアウトの複製と切り替え、カスタムヘルパーの使用、独自のウィジェット構造またはライブラリファイルの作成、またはメインリクエストからの関連のないデータの取り込みを行います。ビューにプッシュスルーして部分的にレンダリングするコントローラー。特定のコンテンツをレンダリングしたり、必要なデータをロードしたりすることで、複数の領域にリークし、使用されている場所で複製されるため、これらは特に優れたオプションではありません。

HMVC、または特にこれらの責任を処理するためにコントローラーにサブリクエストをディスパッチする機能は、明白なソリューションです。あなたが何をしているのかを考えると、それはコントローラーの構造に正確に適合します。コメントに関するデータをロードし、HTML形式で表示する必要があります。したがって、いくつかのパラメーターを使用してコメントコントローラーにリクエストを送信し、モデルとやり取りしてビューを選択すると、ビューにコンテンツが表示されます。唯一の違いは、コメントをインラインで表示することです。完全に別の完全なコメントページではなく、ユーザーが表示しているブログ記事の下に表示します(ただし、HMVCアプローチでは、実際には同じコントローラーで内部と外部の両方のリクエストに対応でき、「killことわざにあるように、1つの石を持つ2羽の鳥」)。この点について、HMVCは、コードのモジュール化、再利用性の向上、および関心事の分離の向上を目指す努力の自然な副産物です。これがHMVCのセールスポイントです。

したがって、HMVCでのスケールアウトに関するSam de FreyssinetのTechPortalの記事は興味深いものですが、HMVCフレームワークを使用する人々の90%以上が、実際的で実用的な日常的なメリットを享受できる場所ではありません。


5
はい、これは私が実際の使用でそれを想像した方法ですが、HMVCのHは誤解を招くので(実際の階層はありません)、この観点からは名前は完全に適切ではありません。
Matteo Riva

2
はい、あなたは良い点を作ります。私は実際にこの見方を共有し、別名「ネストされたMVC」をConfoo 2011のAlloyで行ったプレゼンテーションで付けました。これはSlideshare、スライド#20にあります:slideshare.net/vlucas/alloy-hmvc-php-フレームワーク
Vance Lucas

HMVCは、モジュールのツリーからの複数のリターンの必要性にどのように対処しますか?たとえば、head / body / footerコンテンツ、JS / Css依存関係、モジュール間の相互関係を照合します。イベント?フック?シングルトンページフレームワーク?構造化された戻りオブジェクト?
scipilot

1
この答えは、ウィキペディアのコピーです:/ en.wikipedia.org/wiki/...
EricG

3
@EricGは、私がここで与えた答えを誰かがコピーし、それをWikipediaに追加したようです(それは私ではありませんでした)。ウィキペディアの記事の下部にある「参照」セクションを確認してください。このコメントにリンクしています。
Vance Lucas

7

HMVCは、ディスパッチに対する「コンポーネントベース」のアプローチと密接に関連しています。基本的に、コントローラーに委任する単一のディスパッチャーを持つ代わりに、各コントローラーはそれ自体がディスパッチャーとして機能できます。これにより、コントローラーの階層が得られます。設計はより柔軟で、コードのカプセル化が向上しますが、抽象度が高くなります。Konstruktはこのパターンを中心に設計されています。

この回答もご覧くださいhttps : //stackoverflow.com/questions/115629/simplest-php-routing-framework/120411#120411


7

コハナでは、少なくともHMVCリクエストは「内部」で処理されるHTTPリクエストです。ネットワーク経由で発行されるのではなく、フレームワーク自体によってルーティング、ディスパッチ、処理されます。「HMVC」と「MVC」の名前の類似性は、実際には存在しない用語間の根本的なつながりを示唆しているという点で混乱しています。一方はマイナーバリアントまたはもう一方の変更ではなく、完全に異なるものです。(HMVCは、クライアント側のHTTPリクエストなしのAjaxとも呼ばれます。)コハナが強調し、「HMVC」をサポートすることは、フレームワークがHTTPベースのサービス指向アーキテクチャーを強力にサポートすることを意味します。

このアーキテクチャパターンの利点は、内部要求と外部要求に同じ「呼び出し規約」が使用されるため、必要に応じて「内部」サービス要求を「外部」要求に、またはその逆に変換するのが簡単であることです。

これは賢明なアーキテクチャパターンですが、独自の名前を付けることは不要に思われ(Symfony2は同じ概念「サブリクエスト」を説明します)、実際、名前は誤った名前のようです:特定の要件はなく、リクエストがフォームを形成する必要はありません。階層(すべての命令型プログラムの標準呼び出しグラフ以外)。たとえば、リクエストは簡単に再帰的になる可能性があります。

[ 2011年4月更新、2012年3月:コメントに応じて回答を拡大]


2
「内部」サービスリクエストを「外部」リクエストに変換できるため、必要に応じてより簡単にスケールアウトできます。つまり、一部のアプリケーションモジュールを独自のサーバーに移動できます。
キム王子

1
ええ、それを使って内部のWebサービスを実装してみてください。実際に「それほど重要ではない」かどうかを確認してください。
ケモ

@Kemoすばらしいアーキテクチャだと思います。名前がわかりにくいと思います。Kohanaが特に変わったことをしていることを示しています。
mjs

あなたの答えがどのように役立つかわかりません。あなたは名前について不平を言っているだけの質問に答えているわけではなく、それは不必要である(それは結構です)。
Dave

4

HMVCは階層モデルビューコントローラーです。通常のMVCでは、すべてのGUIオブジェクトにMVCがありますが、HMVCとは異なり、親GUIオブジェクトと子GUIオブジェクトの間に関係はありません。HMVCでは、各GUIオブジェクトはその子オブジェクトにアクセスでき、各子オブジェクトはその親オブジェクトにアクセスできます。

したがって、すべてのビューに親ビューがあり、それを介して親ビューにアクセスできます。すべてのコントローラーには、イベントを親コントローラーに渡すことができる親コントローラーがあります(イベントがスコープ内にない場合)。

詳細説明はこちらをクリックしてください

新しいリンクはこのアドレスです


1
良い答えのマークは、他の情報やコンテキストがないリンクだけではありません。あなたの回答を費やして、リンクされた投稿の関連部分を要約できますか?
Kev

1
@Sanjay、リンクのリンク先をHMVCの記事からモバイル用のgwtの状態に変更した理由はありますか?
Brad Koch

@Koch ..私はリンクを変更しません...誰がそれを変更したのかわからないのですが...元のリンクにリンクしました。
Sanjay Jain
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.