MVC چیست؟ این سوال یکی از پرتکرارترین سوالات در دنیای برنامه نویسی است. زیرا زمانی که پا به دنیای برنامه نویسی میگذارید، قطعا اصطلاحات زیادی به گوش شما خواهد خورد که یکی از رایجترین آنها که در میان برنامه نویسان استفاده میشود، MVC است. بنابراین در این مطلب قصد داریم شما را با این اصلاح به صورت کامل و با زبانی ساده آشنا کنیم. پس اگر میخواهید بدانید MVC چیست و چه کاربردی در توسعه نرم افزارها دارد، در ادامه این مطلب همراه ما باشید.
MVC چیست؟
(Model View Controller) MVC یک معماری برنامه نویسی است که نرم افزار را به سه بخش مجزا تقسیم میکند. این بخشها عبارت اند از Model برای ارتباط با پایگاه داده، View برای ایجاد یک رابط کاربری برای نمایش و تغییر در دادههای پایگاه داده و Controller برای پردازش درخواستهای کاربر.
به عنوان مثال فرض کنید در یک رستوران از منوی آنها سفارش یک پیتزا داده اید. گارسون سفارش شما را دریافت میکند. سپس به پیشخوان آشپزخانه رفته، و سفارش شما را به آنها میرساند. پس از آماده شدن غذا، گارسون غذا را از پیشخوان آشپزخانه به میز شما میرساند. در این مثال:
آشپزخانه به میز شما وابسته نیست.
آشپزخانه به گارسن وابسته نیست.
گارسن از طریق دریافت سفارش تمام غذاهای منو و ارسال آنها به میز شما آگاه است.
شما از روش آماده سازی غذا اطلاع ندارید.
در واقع شما نقش کاربر درخواست کننده اطلاعات را دارید. گارسون به عنوان Controller وظیفه درخواست اطلاعات از آشپزخانه را به عنوان Model و ارسال اطلاعات مدل در قالب سفارش شما یا View را به عهده دارد. به زبان ساده تر:
شما یک User هستید.
گارسون Controller است.
آشپزخانه Model است.
غذایی که سفارش داده اید View است.
مثالی از MVC
حال که دیدید MVC چیست بگذارید تا به سراغ یک مثال واقعی برویم. فرض کنید کاربر آدرس https://7learn.com را در مرورگر خود وارد کرده است. در حالت بدون معماری، پس از فشار دکمه Enter یک Request یا درخواست از سمت کاربر به سمت سرور برای دریافت فایل مورد نظر (به عنوان مثال pizza.php) ارسال میشود. تمام عملیات اتصال به پایگاه داده برای دریافت اطلاعات لازم و همینطور پردازش آن ها، احتمالا در همان فایل یا در فایلهای دیگر در کنار و به صورت وابسته به هم انجام میشود.
اگر شما هم به موضوعات برنامه نویسی علاقهمندید و تمایل دارید که این حوزه علم کامپیوتر را یادبگیرید پیشنهاد میکنیم در دوره آموزش برنامه نویسی سون لرن شرکت کنید و از مشاوره رایگان مشاوران ما بهرهمند شوید.
در حالت [ltr]Request ،MVC[/ltr] پس از ارسال به سرور به Router یا مسیریاب برنامه تحویل داده میشود. Router هر درخواست را به Controller مربوط به خود ارسال میکند. Controller اطلاعاتی که لازم است از پایگاه داده گرفته شود از Model درخواست میکند. Model اطلاعات را از پایگاه داده دریافت کرده و به Controller ارسال میکند. در پایان Controller اطلاعات دریافت شده را به View چسبانده و برای نمایش به سمت کاربر میفرستد.
حالت بدون MVC
تصور کنید وبسایتی داریم که قرار است پس از دریافت شماره پیتزای مورد نظر از URL اطلاعات پیتزای متناسب با آن را از جدول pizza_table پایگاه داده دریافت کرده و در صفحه نمایش دهد. کد زیر این کار را با روش بدون MVC انجام میدهد:
<?php
$index = $_GET['index'];
getPizza($index);
function getPizza($index) {
global $connection;
$pizza = $connection->get('pizza_table' , $index);
print_r($pizza)
}
?>
برنامه ابتدا کد یا شماره پیتزای مورد نظر را از URL دریافت میکند. سپس فانکشن getPizza در همین صفحه فراخوانی میشود. در فانکشن getPizza اطلاعات پیتزای درخواست شده در متغیر $pizza قرار میگیرد و پیتزا در صفحه نمایش داده میشود. در این حالت کدهای شما در هم تنیده هستند. این به آن معنی است که اگر تصمیم بگیرید ظاهر برنامه یا View را تغییر دهید مجبور به تغییر و بازنویسی کل برنامه هستید. همینطور اگر روش اتصال به پایگاه داده تغییر کند و یا حتی بخواهید روش جدیدی برای دریافت اطلاعات و پردازش آنها تعیین کنید!
حالت MVC
پس از ارسال Request به Controller مناسب برای صفحه نمایش پیتزا، Controller اطلاعات پیتزا را از متد getPizza در Model در خواست میکند. سپس با فراخوانی تابع view که وظیفه نمایش فایل View مناسب و چسباندن اطلاعات دریافت شده از پایگاه داده به آن را دارد، نمایش پیتزا را از View درخواست میکند:
class Controller {
public function getPizza($index) {
$model = new Model();
$pizza = $model->getPizza($index);
return view('pizza.php' , $pizza);
}
}
در قسمت Model پس از فراخوانی متد getPizza توسط Controller، اطلاعات پیتزا از جدول Pizza_table پایگاه داده دریافت شده و به Controller پاس داده میشود:
class Model {
public function getPizza($index) {
global $connection;
return $connection->get('pizza_table' , $index);
}
}
تابع view در Controller پس از فراخوانی و دریافت متغیر پیتزای مورد نظر، آن را به فایل pizza.php ارسال کرده و نمایش میدهد:
در این حالت، در صورتی که قصد داشته باشید view را تغییر دهید میتوانید به راحتی این کار را از طریق ایجاد تغییر در فایل pizza.php انجام دهید. ایجاد تغییر در روش پردازش اطلاعات پیتزا و درخواست از Model و همینطور طریقه دریافت اطلاعات از پایگاه داده در Model نیز به همان سادگی است.
نتیجه گیری
در مجموع ممکن است الگوی MVC در ابتدا کمی پیچیده و مشکل به نظر برسد و ترجیح دهید بدون استفاده از این الگو پروژههای خود را پیش ببرید اما اگر قصد انجام پروژههای بزرگ که نیازمند کار تیمی هستند را دارید هرگز از این الگو غافل نشوید. زیرا همانطور که در بالا توضیح داده شد این الگو با جداسازی View ، Model و Control امکان کار جداگانه بر روی هر یک از بخشها را فراهم میکند.
به عنوان مثال متخصص UI میتواند به صورت مستقل بر روی ظاهر تمرکز و کار کند، بدون اینکه توجهی به مسائل منطقی و باگهای برنامه داشته باشد. از دیگر مزایای استفاده از الگوهای معماری میتوان به استفاده دوباره از کدها اشاره کرد. ما در مجموعه سون لرن در جلسه 27 دوره آموزش PHP به این موضوع پرداخته ایم و طراحی و پیاده سازی وبلاگ (CMS) با معماری MVC را به شما آموزش داده ایم.
۱۸ دیدگاه
Reihaneh۰۴ خرداد ۱۴۰۳، ۱۰:۵۰
با این مثال فوق العاده ، هرگز مفهوم معماری mvc رو فراموش نخواهم کرد! سپاسگزارم 🌱
۱۲ خرداد ۱۴۰۲، ۱۴:۴۱
عالی توضیح دادید
۱۶ آذر ۱۴۰۰، ۱۲:۲۸
خیلی ساده و خوب توضیح دادین .. عالی بود .. مرسی
علی۱۱ مهر ۱۴۰۰، ۰۹:۱۹
خیلی ساده و قابل فهم بود ممنون از شما
محمدحسین۲۲ خرداد ۱۴۰۰، ۱۴:۱۹
فوق العاده بود ممنون از راهنماییهاتون
مهدی۲۲ دی ۱۳۹۹، ۱۰:۵۵
با سلام
مقاله ی خیلی آموزنده بود واقعا خیلی واضح و ساده گفته بودین که برای من خیلی کمک کرد.خیلی ممنون
ارشام خورشیدی۱۲ مهر ۱۳۹۹، ۰۷:۵۰
سلام از مطالبتون خیلی استفاده میکنم ممنون
نازنین کریمی مقدم۱۲ مهر ۱۳۹۹، ۱۲:۰۵
سلام. ممنون که با ما همراه هستید.
روح اله احمدی۱۲ اردیبهشت ۱۳۹۹، ۲۲:۰۲
ممنون
هم ساده و خوب گفتین
هم اینکه چون مثال زدین راحتتر شد فهم مساله
فق تو مثال گارسون، به نظرتون منویی که گارسون ارائه میده به مفهوم View نزدیکتر نیست ؟ تا غذایی که ما سفارش میدیم
نازنین کریمی مقدم۱۲ مهر ۱۳۹۹، ۱۲:۰۸
درود خداوند.
دیدگاه شما هم میتونه درست باشه. اینجا محصول نهایی رو مانند یک برنامه و وبسایت درنظر گرفتیم و به همین دلیل غذا به view تشبیه شده.
منوی گارسون رو ابزارهایی در نظر گرفتیم که باهاش میشه view رو ساخت :)
حسین۰۷ بهمن ۱۳۹۸، ۱۱:۱۶
منظور از MVC Core چیست ؟؟
نازنین کریمی مقدم۳۰ شهریور ۱۳۹۹، ۲۰:۰۳
سلام.
میتونید مقاله "<a href="https://7learn.com/blog/what-is-dotnet" rel="noopener noreferrer" target="_blank">آشنایی با برنامهنویسی NET. و تفاوت آن با NET Core.</a>" رو مطالعه کنید. تفاوت رو در این مقاله توضیح دادیم.
علی۰۲ مرداد ۱۳۹۸، ۱۲:۲۲
سلام یه سوالی...
با این سطح آگاهی از mvc در این پست، میتونم به آموزش دوره لاراول بپردازم؟ یا نیازمند آموزش و تحقیق بیشتری در این مدل دارم؟
(php کار کردم)
مهدی علامه۰۳ مرداد ۱۳۹۸، ۰۸:۰۰
سلام علی عزیز
این مطلب دید خیلی خوبی در مورد معماری mvc به شما میده ولی برای درک بهتر این موضوع باید سعی کنی این معماری را در عمل ببینی تا نحوه عملکرد و ساختارش رو بهتر درک کنی
اگر به php و شی گرایی تسلط داری، زمان مناسبی برای شروع یادگیری لاراو است
مسعود۳۱ تیر ۱۳۹۸، ۰۷:۱۱
مقالاتی که در مدت اخیر در سایت میذارید به هیچ وجه مطالب و نکات جدیدی در اونها وجود نداره و بسیار ابتدایی هستند و هزاران مطلب بهتر از اینها در وب فارسی موجوده . کاملا مشخصه هدف این مقالات اصلا آموزش نیست بلکه صرفا تولید محتوا جهت seo سایت است .
مهدی علامه۳۱ تیر ۱۳۹۸، ۱۸:۳۱
تشکر مسعود عزیز
برخی از این مقالات برای کاربرانی است که قصد ورود به دنیای برنامه نویسی را دارند، منتشر میشوند.
تمام مقالات سون لرن با هدف آموزش منتشر میشوند، البته در سطحهای مختلف
مرسی از بازخوردت
در آینده مطالب تخصصیتری را منتشر خواهیم کرد.
Alireza Shahsavary۰۲ مرداد ۱۳۹۸، ۲۱:۲۶
خیلی ممنون بابت مطالب عالیتون ، ضمن احترام به نظر آقای مسعود عزیز
همونطور که اقای علامه فرمودن این سری مطالب برای امثال بنده واقعا کاربردی هستن
مهدی علامه۰۳ مرداد ۱۳۹۸، ۰۸:۰۲
مرسی علی رضای عزیز
خوشحالم که از این مطلب استفاده کردی