Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

مطالب همینجوری

بر و بچ

MyView TakhteShasi Tween

دوستشون دارم

بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:140

MVC چیست؟
۱۹ شهریور ۱۳۸۹ ساعت ۰۴:۴۲

پی اچ پی
اشنایی با مفهوم MVC

الگوهای طراحی صرفا روشهایی برای نظم دادن و ساختار بخشیدن به Applicationها هستند. وجودشون به هیچ وجه الزامی نیست ولی مفید هستند مگر اینکه روش ما روش بهتری برای خودمون و Applicationامون باشه.
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 ارسال کرده و نمایش داده.

 

 

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

 

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

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

 

تو چی فکر می کنی؟


مهدی یعقوبی : من که چیزی نمیدونستم از این mvc میخواستم فریم ورک بنویسیم :دی ، حالا که میدونم چیه برم فریم ورکمو بنویسم :دی
(1 سال و 5 ماه و 13 روز و 16 ساعت و 32 دقیقه پیش)

ماهان : خوب من همیشه تو applicationهام همین کار رو می کردم و می کنم ولی در واقع نمی دونستم اسمش چی بود !. ممنون که توضیح دادی.
(1 سال و 5 ماه و 11 روز و 19 ساعت و 34 دقیقه پیش)

حامد : عالي بود و كاملا شفاف ، ممنون از مقاله خوبت
(1 سال و 5 ماه و 4 روز و 23 ساعت و 56 دقیقه پیش)

مسلم : سلام

من بدینوسیله اظهار تاسف شدید میکنم از اینکه به اینجا سر نمیزنم (برای خودم) و قول میدم برای خوندن این همه مطلب هلو اقدام لازم رو به عمل بیاورم.

با تشکر
:D
(1 سال و 5 ماه و 3 روز و 15 ساعت و 24 دقیقه پیش)

EbiPenMan : منم واقعا خوشحالم که تونستم همچین سایت پر محتوا و مفیدی رو پیدا کنم.

واقعا خسته نباشید
(1 سال و 4 ماه و 19 روز و 4 ساعت و 51 دقیقه پیش)

خانم مهندس : سلام-من مهندس کامپیوتر هستم وبرنامه نویس php یک پسر دارم که اسمش ا میرحسین است و خیلی شیطون بلا ا ست. از مقاله است استفاده کردم. متشکرم
(1 سال و 4 ماه و 14 روز و 18 ساعت و 31 دقیقه پیش)

یک طراح وب : ساده، شفاف و رسا. متشکر.
(1 سال و 2 ماه و 15 روز و 18 ساعت و 42 دقیقه پیش)

یک دوست : واقعا عالی بود !

ممنون
(1 سال و 2 ماه و 15 روز و 14 ساعت و 8 دقیقه پیش)

Alir3z4 : مطلب خوبي بود، اونموقع كه نميدونستم MVC چيه اين بدرد خورد!
اميرحسين دمت جيز ...
تهش هم باس ميگفتي ملت ZF استفاده كنيد تا ثواب مشرف شدن واست حساب ميشد :D
(1 سال و 1 ماه و 3 روز و 13 ساعت و 24 دقیقه پیش)

hamid : salam , merc az maghalat amir hossein age vaght dary bia in mvc ro kamel tar kon va ye jooraei bia avalin kasi bash ke ye refrence kamel ba mesale karbordy vase usera bezar ke mvc ro estefade konan
(1 سال و 21 روز و 3 ساعت و 43 دقیقه پیش)

مجتبي اكبرزاده : سلام
ازتون تشكر مي كنم
خيلي جالب توضيح داده بوديد.
من چند وقت پيش يك مقاله توي گوگل اسكولار خوندم راجع به SVC كه فكر مي كنم نسل بعد از MVC باشه و توي برنامه هاي AJAX BASE كاربرد داره. اگه اون رو هم توضيح بدي فكر مي كنم مطلبت كامل بشه
(1 سال و 16 روز و 7 ساعت و 25 دقیقه پیش)

محمد نوچمنی : سلام من این کدها رو چطور اجرا کنم
مقدمات رو آماده کردم یعنی :
-دیتابیس و جدول رو ایجاد کردم.
-این سه قسمت رو تو سه فایل جداگانه قرار دادم
-حالا چه کار کنم؟
(1 سال و 8 روز و 6 ساعت و 1 دقیقه پیش)

امیرحسین : همین دیگه. این ساختار رو حفظ کنید تا سیستم شما بصورت MVC طراحی شده باشه و بتونید از خصوصیاتش بهرمند بشید...
(1 سال و 7 روز و 20 ساعت و 5 دقیقه پیش)

یک دوست : سلام عزیز جون
خیلی خیلی عالی بود
من چند تا سایت مختلف رو خوندم
اما هیچ کدوم به خوبی و رسایی شما توضیح نداده بودند
مخصوصا که مثال هم زده بودید
خیلی حال داد!
بازهم ممنونم
(12 ماه و 13 ساعت و 24 دقیقه پیش)

پیمان : تو این روش model عملا با یه فایل کتابخانه ای فرقی نداره و دوباره خیلی از پیچیدگی های سیستم تو controller اتفاق میفته و خلاصه که به نظرم مزیت چنانی هم نداره فقط از اسپاگتی کد زدن بهتره.
اگر کنترلر فقط یک سوئیچ بود و مدل یک لایه کار با دیتابیس به صورت sql شاید بهتر میشد یعنی تو کنترلر کد sql نزنه
(11 ماه و 20 روز و 5 ساعت و 6 دقیقه پیش)

امیرحسین : اینجا صحبت سر مفاهیمه!
برای اجرای مؤثر، حرف شما کاملا صحیحه و باید وارد جزییات شد.
(11 ماه و 18 روز و 9 ساعت و 54 دقیقه پیش)

هادی : thanks a lot!
(10 ماه و 25 روز و 8 ساعت و 57 دقیقه پیش)

محمدرضا : سلام رفیق
بسیار شیوا و رسا حق مطلب رو رسوندی.واقعا لازم بود قبل از خوندن منابع اصلی این مطالب خونده بشه
ممنون.
(10 ماه و 23 روز و 21 ساعت و 47 دقیقه پیش)

حسین سرلک : سلام خدمت شما.
از شما برای ذکر نکردن منبع مطلب MVC عزرخواهی میکنم.
(10 ماه و 21 روز و 9 ساعت و 30 دقیقه پیش)

امیرحسین : ممنون از شما.
(10 ماه و 21 روز و 7 ساعت و 33 دقیقه پیش)

امیر د : با سلام و خسته نباشید
دوست عزیز مطلب خوبی رو نوشتید ولی شما گفتید که mvc یکی از مفاهیم php هست ولی بهتر بود می گفتید زبان های سطح بالا چون این مفهوم توی asp که هست و توی C# هم مطمئنا اسم معماری 3 لایه رو که همین mvc هست شنیدید!؟
اینطوری یه خورده مقاله تون زیر سوال می ره . موفق باشید
(10 ماه و 19 روز و 6 ساعت و 4 دقیقه پیش)

امیرحسین : شما هم مثل اینکه متاسفانه دچار سندرم PHP/ASP هستید که از این جمله، چنین برداشتی میکنید.
یکی میاد میگه: طراحی بدنه از نقاط قوت BMW است. یکی دیگه میاد میگه پس Toyota چی؟!
اگه به مفهوم الگوهای طراحی واقف باشیم میفهمیم که وابسته به زبان نیستند.
(10 ماه و 18 روز و 8 ساعت و 43 دقیقه پیش)

احسان ملکی زوارم : خودمم هم خبر نداشتم ولی این سیستم رو از 3 سال پیش داشتم کار میکردم××
(10 ماه و 6 روز و 8 ساعت و 41 دقیقه پیش)

habib : دوستان
به نظر من این کار خیلی خوبه و یه امکان هایی هم به ما میده
از جمله دسترسی به کد ها سخت تر میشه و تا حدودی امنیت بالاتر میره

اما اگه بخواهیم از این مورد استفاده کنیم بهتره (تجربه شخصی بنده ) از کلاس ها و فایل های متعدد و همچنین require کردن فایل ها استفاده کنیم

بحث آخر و تکنیکی که شما را یه حرفه ای نشون میده اینه که شما از smarty استفاده کنید و حتی یه دونه کد html و echo در فایل php نداشته باشید
(9 ماه و 26 روز و 12 ساعت و 26 دقیقه پیش)

علی : دست مریزاد! :)
(9 ماه و 18 روز و 20 ساعت و 21 دقیقه پیش)

Ehsan : متشکرم
(8 ماه و 12 روز و 18 ساعت و 4 دقیقه پیش)

حمید : بابا خیلی حال میکنم با سایتت یا وبلاگت یا ...
لطفا از موتور اسمارتی هم توضیح بدید
یه سوالم دارم : من حدود یک ساله پشت اینترنتم که پی اچ پی یاد بگیرم و همه چی رو میدونم از ساخت تابع تا ایجاد کلاس و متد و ...
ولی نمیدونم از کجا شروع کنم میخوام منظم و به صورت استاندارد برنامه نویسی کنم مثل همین model view controller و اسمارتی
لطفا یه مبحثی در این باره ایجاد کنید خیلی خیلی ممنون از سایت قشنگتون
(8 ماه و 5 روز و 7 ساعت و 32 دقیقه پیش)

hf : بسیار عالیه لطفا ادامه بدین
(7 ماه و 24 روز و 3 ساعت و 17 دقیقه پیش)

حسین : بسیار عالی بود لطف کنید و از این مطالب آموزشی شفاف بگذارید.
(6 ماه و 4 روز و 19 ساعت و 40 دقیقه پیش)

مشهدی : من کلا موافق این سیستم MVC نیستم. البته اگه برای یک پروژه خیلی بزرگ شاید لازم بشه ولی برای موارد معمولی وقت تلف کردنه. در واقع شما باید هم PHP یاد بگیرید و هم یک زبان دیگه که فریم ورک باشد (مثل CakePHP) و توابعش و متدها و ... و در ضمن وابسته میشین به فریم ورک.
من شخصا پروژه بزرگی (در حد 200 میلیون تومن) انجام داده با همین PHP معمولی و بسیار بسیار هم فرآیند توسعه آسون بوده برام.
(4 ماه و 19 روز و 19 ساعت و 41 دقیقه پیش)

امیررضا : دم شما گرم من هم نمیدونستم چیه. در این زمینه هم مشکل زیاد داشتم. کلا چند وقت بود دنبال یک راه حل خوب بودم
(3 ماه و 28 روز و 13 ساعت و 41 دقیقه پیش)

سامان وحدت : The Model-View-Controller (MVC) Design Pattern for PHP

http://www.tonymarston.net/php-mysql/model-view-controller.html
(3 ماه و 23 روز و 10 ساعت و 35 دقیقه پیش)

حمید سلطانی : یکم خطا داری برادر!:دی
http://en.wikipedia.org/wiki/Model-view-controller
(3 ماه و 22 روز و 20 ساعت و 18 دقیقه پیش)

hilda : damet garm
(3 ماه و 16 روز و 5 ساعت و 3 دقیقه پیش)

kingnothing : سلام.
مطالب خیلی خوب و مفید بود. واقعا ممنون.
موفق یاشید.
(3 ماه و 15 روز و 11 ساعت و 10 دقیقه پیش)

حامد : مطلب بسیار خوبی بود.
چند جا در مورد این معماری خونده بودم ولی تو این مطلب کامل متوجه موضوع شدم.
از این قبیل مقالات تو وب فارسی زیاد نوشته نمیشه.
ممنون امیرحسین
(3 ماه و 9 روز و 7 ساعت و 46 دقیقه پیش)

ارش : بسیار بسیار بسیار عالی. من همیشه گفتم یکی از دلایل عدم پیشرف ماها اینه که اطلاعاتمون رو انتقال نمیدیم. تعداد سایت های تجاری و مزخرف به میلیون میرسه اما همش چند تا سایت علمی درست داریم که مطمئنا یکیش همینه. بازم ممنون از مقاله ی خوبت و امیدوارم با قدرت به کاری که میکنی ، یعنی انتشار مقالات علمی ادامه بدی
(3 ماه و 7 روز و 15 ساعت و 25 دقیقه پیش)

sara : از مطالب پر محتوا ومفید تون ممنونم
(2 ماه و 19 روز و 20 ساعت و 53 دقیقه پیش)

 

me

امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

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

به خونه امیرحسین خوش اومدی...

MODx | Template World