انجمن عمومی گسترش فناوری آگو
MVC در PHP قسمت اول :: معرفی - نسخه‌ی قابل چاپ

+- انجمن عمومی گسترش فناوری آگو (http://forums.ago.ir)
+-- انجمن: انجمن های عمومی گسترش فناوری آگو (/forumdisplay.php?fid=1)
+--- انجمن: برنامه نویسی (/forumdisplay.php?fid=13)
+--- موضوع: MVC در PHP قسمت اول :: معرفی (/showthread.php?tid=2194)



MVC در PHP قسمت اول :: معرفی - agotd - 11-19-2013 02:46 PM

سلام

امیدوارم که حالتون خوب باشه . از اینکه در آپدیت سایت تاخیر داریم عذرخواهی میکنم.بعد از این چند وقت به پیشنهاد یکی از دوستان تصمیم گرفتم در مورد MVC در php توضیح بدم.MVC موضوعیه که دو سه سالی توی ایران رونق بیشتری گرفته و به یکی از بحث های اول کاربران تبدیل شده.

توی این سری از مقالات ابتد به مفهوم معماری سه لایه MVC میپردازیم.این رو هم بگم که معماری سه لایه فقط MVC نیست و مدل دیگه این معماری MVP نام داره که الان باهاش هیچ کاری نداریم.

برای اینکه این سری از مقالات رو دنبال کنید بهتره که شیء گرایی رو در PHP مسلط باشید و یا حداقل با مفاهیم شیء گرایی آشنایی داشته باشید

MVC چیست ؟

اولین سوالی که پیش میاد اینه که MVC چیه و چه کاربردی داره؟

MVC یک معماری سه لایه است که در سال ۱۹۷۰ ایجاد شد.این معماری ابتدا برای زبان smalltalk ایجاد شد. هدف از ایجاد این معماری این بود که قسمت کد نویسی یا منطق برنامه رو از قسمت طراحی اون جدا کنن. مزایایی که این کار در بر داشت این بود که نگهداری و تغییر در کدها در آینده بسیار راحت بود ، کدهایی که نوشته میشدن قابل استفاده مجدد بودن و مهمترین قابلیت این بود که یک طراح و یک برنامه نویس میتونستن روی یک پروژه در آن واحد کار کنن بدون اینکه اختلالی توی کار هم به وجود بیارن.

با فراگیر تر شدن وب برنامه نویسان وب تصمیم به استفاده از این معماری در طراحی و برنامه نویسی وب کردند.

معماری سه لایه از سه قسمت Model , View , Controller تشکیل میشه. که در زیر به شرح مختصری در مورد هر کدوم از لایه ها میپردازیم.

[تصویر:  200px-MVC-Process.png]

لایه Model

” این لایه برای ارتباط با دیتابیس استفاده میشه. این لایه باید اجازه دسترسی ، تغییر یا اضافه کردن داده ها رو بده . این لایه در واقع یک پل بین لایه View و لایه Controller ـه. یکی از مهمترین خاصیت های این لایه اینه که ” نابیناست ” به این معنی که مدل نمیدونه وقتی که داد هارو به View یا کنترلر ارسال کرد قرار چه اتفاقی براشون بیافته و به دنبال پاسخی از Controller یا View نیست.تنها هدفش اینه که داده هارو ذخیره کنه یا زمانی که درخواستی از بقیه لایه ها ارسال شد تغییرشون بده. ” (منبع)

در خیلی از جاها گفته شده که لایه مدل نباید با لایه ویو ارتباط داشته و فقط و فقط باید با لایه کنترلر در ارتباط باشه.ولی چیزی که در مورد این لایه مهمه اینه که این لایه مسئول ارتباط با دیتابیسه . حذف ، اضافه و ویرایش داده های دیتابیس توی این لایه انجام میشه.
لایه View

این لایه جاییه که داده ها از مدل گرفته میشن و به صورت خروجی به کاربر نمایش داده میشن.در برنامه های وب این لایه جاییه که کدهای HTML ساخته و نمایش داده میشن.توی این لایه ارتباط با کاربر انجام میشه و با کنترلر درخواست کاربر رو انجام میده.به عنوان مثال یک button رو درنظر بگیرید که وقتی روش کلیک شد یکی از action های کنترلر رو صدا میزنه.

یک سری تصورات غلط در مورد این لایه در برنامه نویسان وب وجود داره . یکی از این تصورات اشتباه اینه که لایه View نباید هیچ ارتباطی با لایه Model داشته باشه و باید همه اطلاعات رو از لایه Controller بگیره.مثلا در فریم ورک Cakephp و اکثر فریم ورکهای PHP این اشتباه وجود داره. در واقع این تفکر نادیده گرفتن کامل تئوریه پشت معماری سه لایه است.

قسمت بالا از Callum Hopkins بود که در سایت sitepoint مقاله معماری سه لایه رو نوشته بود. دراین مقاله ذکر شده که لایه مدل و ویو میتونن باهم ارتباط داشته باشن و درواقع لایه Model یک پل بین لایه ویو و کنترلره . در همین سایت و در این مقاله ذکر شده که :

این نکته خیلی مهمه که توجه داشته باشید برای پیاده سازی درست معماری MVC لایه View نباید با لایه Model ارتباط داشته باشه و منطق برنامه باید فقط در لایه Controller انجام بشه.

از اونجا که بین علما اختلاف نظر وجود داره تحقیق بشتری کردم و در این مقاله به نقل از گروه Gang of four در مورد معماری MVC اینطور نوشته :

MVC شامل مدل ها و ویو هاییه که میتونن با هم ارتباط داشته باشن. یک View باید مطمئن باشه که ظاهری که الان میخواد به خودش بگیره باید حالتی از model باشه.هر وقت که دیتا در لایه model تغییر کرد یک پیغام به ویو میفرسته که بسته به اون تغییر کنه.

بازم چیزی که در مورد این لایه مهمه اینه که این لایه وظیفه نمایش داده ها و گرفتن و ارسال اون رو به لایه Controller داره.ما هم زیاد سخت نمیگیریم و هر طوری که راحتیم فریم ورک خودمون رو مینویسم چون قرار نیست کسی به خاطر اینکه آیا این دولایه باید باهم ارتباط داشته باشن یا نه ، مارو مجازات کنه.
لایه Controller

این لایه منطق برنامه رو کنترل میکنه.این لایه ورودی ها رو میگیره و درخواست های کاربر رو انجام میده ، اگر نیاز باشه از دیتابیس مقادیری برای کاربر ارسال بشه رو از لایه Model میگیره و به لایه View ارسال میکنه.

به هر حال در باره کارکرد این سه لایه باهم نقل قول های زیادی شده که هر کی هرجور دلش خواسته باهاش بخورد کرده.شما با هر کدوم راحت ترید کار کنید ولی اینو بدونید که اصل موضوع چیه.

خب این سه لایه رو به شکل مختصر توضیح دادیم بریم ببنیم این معماری چطوری کار میکنه.

ایده این معماری بسیار ساده است.شما یک فایل اصلی دارین مثلا index.php که تمام درخواست های کاربر به اون فرستاده میشه.بعد از اینکه درخواست رو ازکاربر دریافت کرد کلاس ها و توابع مورد نظر رو اجرا میکنه و View مورد نظر رو به کاربر نمایش میده.

برای درخواست زیر :

index.php?page=user&action=delete&param=2,3,5

کد php:
if(isset($_GET['page'])){
    
$page $_GET['page'];
}else
{
    
$page 'index';
}

include 
"lib/$page.php";
if(isset(
$_GET['action'])){
    
$action $_GET['action'];
}else{
    
$action 'default';
}

if(isset(
$_GET['param'])){
    
$param explode(',',$_GET['param']);
}else{
    
$param = array();
}
$obj = new $page();
$obj->$action($param);