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

این سه بخش به این شکل تعریف میشه: کدهایی برای ارتباط با دیتابیس، کدهایی برای ساختن خروجی و کدهایی برای کنترل و دسترسی به این دو بخش.
توضیح دقیقتر این سه بخش به شرح زیر است:

Model: کدهایی برای تبادل اطلاعات با دیتابیس. این بخش مثل یک موتور عمل می کنه. هیچ ارتباطی با اتفاقات نداره فقط ازش اطلاعات درخواست می کنیم، از دیتابیس بیرون میکشه و میده.
View: کدهایی برای سر هم کردن اطلاعات و ساختن خروجی. این بخش به هیچ عنوان کد منطقی (کد عملیاتی، کدی که کار عملیاتی انجام میده) نداره فقط اطلاعات رو میگیره تحلیل می کنه، تحت قالب قرار میده و به Controller میفرسته تا نمایش داده بشه.
Controller: در واقع Controller بقیه کارها رو انجام میده. اینکه چه درخواستی از کاربر رسیده، چه درخواستی از Model باید بشه، اطلاعات گرفته شده از Model چطور باید پردازش بشه، چه Viewای باید انتخاب بشه و چه اطلاعاتی به View باید ارسال بشه.

اگر آشنایی قبلی با MVC نداشتی، این توضیحات یکم گنگ هستند. یک نمونه مثال میزنم. یک سیستم لاگین میخوایم بنویسیم بصورت MVC. از جایی که کاربر نام کاربری و کلمه عبورش رو در فرم وارد می کنه و دکمه ورود رو میزنه.
ابتدا مراحل رو لیست می کنیم:

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

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

Model دیتابیس رو چک می کنه و مطابقتی پیدا نمی کنه و این جواب رو به Controller برمیگردونه.

Controller این نتیجه رو پردازش می کنه و میفهمه که باید فرم لاگین و پیغام خطا رو به کاربر برگردونه.

Controller براساس تحلیلهاش، View مناسب رو پیدا می کنه و اطلاعات قابل نمایش رو به View میده.

View یک قالب خام هست که منتظر پر شدن با اطلاعات هست مثلا View فرم لاگین، یک بخش پیغام داره. این بخش با اطلاعاتی که از Controller میاد پر خواهد شد. Controller این پیغام رو فرستاده، View در فرم جایگزین می کنه.

View فرم تحلیل شده رو به Controller میفرسته.

Controller نتیجه View رو به کاربر میفرسته (چاپ می کنه).

حالا این مراحل رو در عمل با یک مثال فوق العاده ساده آزمایش می کنیم:
ابتدا کدها رو می نویسیم:
**
View:**

<form method="post">
	<?php echo (isset($message) ? $message : ''); ?>
	Username: <input type="text" name="username" value="" />
	Password: <input type="password" name="password" value="" />
	<input type="submit" name="action" value="login" />
</form>

Model:

Class myModel {
	public function __construct() {
		$this->conn = mysql_connect('localhost', 'root', '');
		mysql_select_db('myDB');
	}
	
	public function getRow($sql) {
		$query = mysql_query($sql);
		return mysql_fetch_assoc($query);
	}
	
	public function escape($str) {
		return mysql_real_escape_string($str);
	}
}

Controller:

include './model/myModel.php';
$myModel = new myModel;

if(isset($_POST['action'])) {
	
	if($_POST['action'] == 'login') {
		$username = $myModel->escape($_POST['username']);
		$password = $myModel->escape($_POST['password']);
		$password = MD5($password);
		
		$response = $myModel->getRow("
			SELECT * FROM users 
			WHERE
				`username`='$username'
				AND `password`='$password'
		");
		
		if($response == false) {
			$message = 'Invalid Username or Password';
			$view = './view/login-form.php';
			return include $view;
		} else {
			// do something
		}
	}
	
	
	if($_POST['action'] == 'something') {
		// do something
	}
}

اینجا وقتی فرم ارسال میشه. در Controller از اونجاییکه در این مثال ابتدایی فقط یک Model داریم ازش نمونه گیری می کنیم.
این Model یک کلاس هست با سه تا متد. متد اصلی که فقط به دیتابیس متصل میشه. متدی که اطلاعات رو پردازش می کنه و متدی که دستور SQL میگیره و یک سطر از دیتابیس رو میده.
نکته قابل توجه مهم در Model اینه که همونجور که واضحه در Model هیچ خبری از Controller نیست در واقع خبری از هیچی نیست. Model هیچ ارتباطی با سایت و اسکریپتها نداره، فقط میشه ازش استفاده کرد.
Controller مثلا براساس action عمل می کنه. اومده مقادیری که از Action میتونه بیاد رو چک کرده. ما در این مثال با حالت login کار داریم. وقتی کاربر فرم رو ارسال کرده، مقدار login رو برای Action فرستاده.
Controller توسط متد escape از Model اطلاعات لازم برای لاگین رو چک کرده و توسط Model اطلاعات کاربری با چنین مشخصاتی رو درخواست کرده.
از اونجایی که چنین کاربری وجود نداره، پس Model هم مقدار false میده. Controller پیش بینی چنین نتیجه ای رو کرده و در این حالت فرم لاگین رو به عنوان View انتخاب کرده. یک متغیر به این View ارسال کرده و نمایش داده.

[color=#FF0000]تا اینجاش مثال و تعریف بود. سوال اصلی اینجا شروع میشه که این کارا به چه درد میخوره؟[/color]
معجزه MVC یک کلمه است. یک کلمه خیلی ساده ی سه حرفی: نظم!
عادت خیلی بدی که اغلب برنامه نویسان دارند اینه که همه کدها رو با هم قاطی می کنند و یک آش بد مزه درست می کنند. MVC ضمانت می کنه که تعامل با دیتابیس فقط در Model انجام میشه هیــــچ جای دیگه ای نباید دنبالش بگردیم. همه خروجی ها توسط بخش View کنترل میشه و هیــــچ جای دیگه ای نباید دنبالش بگردیم. در Controller هیــــچ اثری از echo یا کد HTML یا توابع MySQL نیست. MVC همونطور که از اسمش مشخصه یک الگوی طراحیه. الگو یعنی شیوه ی قابل تقلید.
پس MVC چیزی جز یک مفهوم نظم بخشیدن نیست. مفهومی که میگه کدها رو به سه قسمت مجزا تقسیم کنیم تا کنترل خوبی روش داشته باشیم. این مثالی که اینجا زدم فوق العاده ابتدایی و ساده بود ولی مفهوم رو داشت این یعنی برای اجرای MVC، لازم نیست حتما سراغ فریم ورکهای MVC بریم یا حتما نباید Applicationامون بزرگ باشه تا سراغش بریم. یک اسکریپت خیلی کوچیک رو هم میشه براساس MVC طراحی کرد.

[color=#FF0000]حالا یک بحث تکمیلی. چطور با فریم ورکهای MVC کار کنیم؟[/color]
فریم ورکهای MVC مثل CakePHP یا CodeIgniter یا MODx Revolution (:دی) و غیره، با همه پیچیدگی ها و شلوغ پلوغی هاشون، این ساختار رو دارند. کافیه ساختار MVC رو توشون پیدا کنیم. بقیه اش دیگه میشه یاد گرفتن متدها و کلاسهاشون. یعنی اولین گام اینه که کشف کنیم فلان فریم ورک، چطور داره Controllerاش رو استفاده می کنه، کجا و به چه شکل. از اونجایی که Controller با Model در ارتباطه، می تونیم شکل تعامل با Model رو کشف کنیم و برای View هم به همین شکل. مثلا Object اصلی ای وجود داره برای دسترسی به Modelها. این رو که متوجه بشیم، فقط کافیه بریم ببینیم چه Modelهایی داریم، چه توابع یا کلاسهای داریم. خلاصه با پیدا کردن سر و ته MVC توی کوه کدهاشون، 80 درصد کار انجام شده بقیه اش توابع و کلاسهاست که باید بخونیم تا یاد بگیریم.

امیدوارم اگر MVC رو نمیشناختی این مقاله کمکی کرده باشه
همچنین امیدوارم شاهد Applicationهای بهتر و قوی تری توسط ایرانی ها باشیم.

boplo.ir