HMVC یک الگوی معماری نرمافزار ماژولار است که مخفف Hierarchical Model-View-Controller است. به زبان ساده، به آن معماری سلسله مراتبیِ MVC میگویند یعنی هر ماژول دارای اجزای Model-View-Controller مخصوص به خود است که یک راه برای جداسازی یک برنامه کاربردی به اجزای قابل استفاده مجدد است.
این الگو اغلب در توسعه وب استفاده می شود تا کدهای ماژولار و قابل نگهداری بیشتر را فراهم کند و همچنین راهی برای سازماندهی کد به اجزای قابل استفاده مجدد و مستقل ارائه دهد.
برای اینکه بتوانید این معماری را بهتر درک کنیم، پیشنهاد میکم ابتدا معماری MVC را در لینک زیر مطالعه نمایید:
MVC چیست و چه کاربردی در برنامه نویسی دارد؟
اگر قصد دارید یک پروژه کوچک طراحی کنید، معماری MVC میتواند آن را پیچیده کند، بنابراین در این مورد خاص استفاده از MVC پیشنهاد نمیشود.
اگر قصد دارید یک پروژه نسبتا بزرگ را طراحی کنید که یک تیم کوچک روی آن فعالیت میکند، پیشنهاد میکنم از معماری MVC استفاده کنید.
اما اگر میخواهید یک پروژه بزرگتر را طراحی کنید که یک تیم بزرگ روی آن فعالیت میکند، در این مورد میتوانید از معماری HMVC استفاده نمایید.
پس وقتی تعدادی MVC را به صورت مجزا طراحی کنیم و به یکدیگر متصل کنیم، معماری HMVC بوجود میآید.

حالا به تصویر زیر دقت کنید. در سمت چپ یک معماری MVC داریم. اما در سمت راست معماری HMVC. یعنی هر MVC در یک کپسول و به صورت ماژول قابل استفاده دارای پوشههای model، view و controller است. در نهایت به یکدیگر Request میزنند و با هم در ارتباط هستند.

یعنی اگر ما سه ماژول با نام های «Auth» ، «User» و «Task» داشته باشیم، به صورت زیر تعریف میشوند:
Auth
/controller
/model
/view
User
/controller
/model
/view
Task
/controller
/model
/view
در معماری MVC طبیعتا تمامی فایلها در پوشههای model ، view و controller قرار میگیرند. با کمی گسترش پروژه خواهید دید که نظم دادن به تمامی این فایلها بسیار سخت و برنامه نویسی هم طبیعتا سخت تر خواهد شد.
اما در معماری HMVC شما برای هر بخش یک ماژول دارید که در پوشه Module قرار میگیرند. مثلا ماژول کاربران در یک پوشه به نام users قرار دارند که داخل این پوشه، پوشههای model، view و controller را ایجاد میکنید. با این معماری، پوشهها و فایلهای شما منظمتر خواهد بود و یکی از مزایای این معماری، قابلیت استفاده مجدد از کدها میباشد. مثلا میتوانید با انتقال پوشه users به سایر پروژهها، دوباره از آن استفاده کنید. همچنین به دلیل اینکه هر ماژول مستقل از سایر ماژول ها به کار خود ادامه میدهد، اخلال در آن یک ماژول، معمولا تاثیری در سایر ماژولها ندارد.
در اینجا یک مثال ساده از نحوه استفاده از معماری مدل-نما-کنترلر سلسله مراتبی (HMVC) در یک وبسایت آورده شده است:
یک فروشگاه اینترنتی را در نظر بگیرید که لیستی از محصولات را در آن داریم. حالا میتوانیم هر محصول را باز کنیم و جزئیات آن را بررسی کنیم یا محصول را به سبد خرید اضافه کنیم. برنامه را میتوانیم با استفاده از HMVC به اجزای زیر تقسیم کنیم:
1- Model: این مولفه دادهها و رفتار برنامه را نشان میدهد. مدل شامل کلاسهایی است که محصولات، سبد خرید و سایر دادهها را مدیریت میکنند.
2- View: این کامپوننت دادهها را به کاربر نمایش می دهد. ویو شامل الگوها و کدهای HTML است که لیست محصول، جزئیات محصول، سبد خرید و سایر صفحات را نمایش میدهد.
3- Controller: این مؤلفه تعاملات کاربر را مدیریت میکند و Model و View را به روز می کند. کنترلر شامل کدهایی است که اقدامات کاربر را انجام می دهد، مانند کلیک کردن روی یک محصول برای مشاهده جزئیات آن، افزودن یک محصول به سبد خرید یا چک کردن.
4- زیر ماژول ها: در HMVC، هر یک از اجزای فوق را میتوان به اجزای کوچکتر یا زیر ماژولها تقسیم کرد. برای مثال، جزئیات محصول و اجزای سبد خرید میتوانند زیر ماژولهای جداگانه با اجزای Model، View و Controller خود باشند.
این فقط یک مثال ساده است، اما نشان می دهد که چگونه می توان از معماری HMVC برای ساختار یک برنامه وب استفاده کرد و آن را مدیریت پذیرتر و مقیاس پذیرتر کرد.
حالا مثال بالا را با زبان برنامه نویسی PHP توضیح خواهم داد:
1- Model: این مولفه دادهها و رفتار برنامه را نشان میدهد. به عنوان مثال، می توانید کلاسی به نام Product داشته باشید که اطلاعات محصول را از پایگاه داده میگیرد و چهار عمل CRUD را روی آنها انجام میدهد.
class Product {
public function getProducts() {
// Code to retrieve product information from a database
return $products;
}
public function addProduct($product) {
// Code to add a product to the database
}
public function deleteProduct($productId) {
// Code to delete a product from the database
}
}
2- View: این کامپوننت دادهها را به کاربر نمایش می دهد. به عنوان مثال، می توانید یک فایل قالب به نام product_list.php داشته باشید که لیستی از محصولات را نمایش میدهد.
<h1>Product List</h1>
<ul>
<?php foreach ($products as $product) { ?>
<li><?php echo $product['name']; ?></li>
<?php } ?>
</ul>
3- Controller: این مؤلفه تعاملات کاربر را مدیریت میکند و Model و View را بهروز میکند. به عنوان مثال، می توانید فایلی به نام product_controller.php بسازید که لیستی از محصولات را نمایش میدهد و میتواند اضافه کردن یا حذف کردن محصولات را انجام دهد.
class ProductController {
public function listProducts() {
$productModel = new Product();
$products = $productModel->getProducts();
include 'product_list.php';
}
public function addProduct() {
$productModel = new Product();
$productModel->addProduct($_POST['product']);
$this->listProducts();
}
public function deleteProduct() {
$productModel = new Product();
$productModel->deleteProduct($_GET['id']);
$this->listProducts();
}
}
4- زیر ماژول ها: در این مثال، هر یک از اجزای فوق را میتوان به اجزای کوچکتر یا زیر ماژولها تقسیم کرد. برای مثال، میتوانید ماژولهای فرعی جداگانهای برای ویرایش محصول و افزودن محصول سبد خرید، با اجزای Model، View و Controller خود داشته باشید.
با تقسیم برنامه به اجزای کوچکتر و قابل استفاده مجدد، HMVC مدیریت کد را راحتتر و قابلیت نگهداری را آسانتر میکند. علاوه بر این، ماژولهای فرعی را میتوان در بخشهای مختلف برنامه مورد استفاده مجدد قرار داد، که باعث کاهش تکرار کد و بهبود استفاده مجدد از کد می شود.