PDA

View Full Version : آموزش: آشنایی با الگوی MVC و پیاده سازی آن



Mahmoudzadeh.A
دوشنبه 02 مرداد 1391, 12:50 عصر
سلام!
قبلا چند تا مطلب در مورد الگوی MVC قرار داده بودم در چند تاپیک مختلف.اما در این تاپیک به طور منسجم به الگوی MVC خواهیم پرداخت و در باره ی مفاهیم و پیاده سازی آن بحث خواهیم کرد. ان شاء الله

مباحثی که به آن خواهیم پرداخت:
1- مفاهیم اولیه مدل MVC و مزایای استفاده از آن
2- اجزای مدل MVC
3- بررسی تک تک اجزاء الگوی MVC
4- مثال های عملی از این الگو
5- استفاده از مو تور های قالب template Engine مانند smarty در این الگو
6- راهکار ها و تکنیک های بالا بردن سرعت و امنیت در این الگو
7- نحوه استفاده از ajax در این مدل
8- سایر مباحث جدید.....

Mahmoudzadeh.A
دوشنبه 02 مرداد 1391, 14:27 عصر
الگوی MVC معرف یک مدل پیاده سازی نرم افزاری است هدف ازاین مدل جداسازی قسمت های مختلف برنامه از یکدیگر است به گونه ای که جریان داده ای بین آنها حفظ شود. این مدل شامل 3 قسمت اصلی می باشد و جزء الگوهای سه لایه محسوب می شوند که عبارتند از :

1- Model: واسطی است بین بانک و لایه کنترلر که داده های لازم را برای کنترلر استخراج می کند و در اختیار آن قرار می دهد.

2- View: واسطی است که ویو لازم را در اختیار دارد و نمایش آن را مدیریت می کند.

3- Controller : وظیفه آن انتخاب ویو مناسب و قرار دادن داده های لازم در آن ( که از لایه مدل دریافت کرده و یا از فایل و ... ) است.


استفاده از الگوی MVC باعث می شود که : اولا بتنوانیم مجددا از کد استفاده کنیم ثانیا منطق و نمایش کد و داده ها از هم جدا شده است که درک و تغییر آن ساده تر می شود.
90124

Mahmoudzadeh.A
دوشنبه 02 مرداد 1391, 22:30 عصر
سلام جناب desatir7316 (http://barnamenevis.org/member.php?125754-desatir7316) ان شاء الله با کمک شما بریم جلو و به توفیق خدا جانزنیم و ادامه بدیم.
در این تاپیک بیشتر مطالب آموزشی است و اینجوری نیست که فقط یک نفر مطالب بزاره و بقیه کپی کنن.
هرکس که احساس کرد که چیزی در این موضوع بلد هست که میتونه مفید باشه و به بقیه کمک کنه می تونه در این تاپیک قرار بده .

من هم چیزی زیادی بلد نیستم ولی همون مقداری رو که بلد هستم دوست دارم به دیگران انتقال بدم.
منتظر استفاده از دانش شما و سایر دوستان هستیم.
با تشکر.
-----------------------------------

Mahmoudzadeh.A
دوشنبه 02 مرداد 1391, 22:40 عصر
چند تا منبع انگلیسی نسبتا مناسب برای اشنایی با اجزا

1-

http://www.nathandavison.com/posts/view/11/custom-php-mvc-tutorial-part-1-introduction


2-

http://johnsquibb.com/tutorials/mvc-framework-in-1-hour-part-one




3-
http://www.phpro.org/tutorials/Model-View-Controller-MVC.html

ان شاء الله خیلی ریز تر به تک تک اجزاء و مفاهیم ، پیاده سازی کد ها خواهیم پرداخت

Mahmoudzadeh.A
سه شنبه 03 مرداد 1391, 09:48 صبح
ساختار سایت ها بر مبنای الگوی MVC:
معمولا سایت هایی که بر اساس MVC پیاده سازی می شوند به صورت ساختار زیر می باشند.
فولدر config:حاوی فایل هایی برای تنظیمات ، مقادیر اولیه و ... مربوط به سایت هست.
فولدر MVC: این فولدر حاوی سه لایه های الگوی mvc می باشد.
فولدر Library:این فولدر حاوی کلاس های استفاده شده در سایت می باشد.به عنوان مثال:

captcha,router,session,uer,dispatch,calander


فایل htaccess:این فایل حاوی تنظیمات و موارد امنیتی ، دسترسی به فولدرها و url ها و غیره
فایل index.php:این فایل اولین نقطه ورود و یا همون شروع سایت می باشد.در این فایل تنظیمات لود می شوند و یک شی روتر ساخته می شه که url (درخواست ورودی ) رو تجزیه می کنه و کنترلر و action مناسب برای این کنترلر رو انتخاب می کنه و در نهایت اون کنترلر رو لود می کنه و ادامه ماجرا توسط کنترلر خواهد بود.






-
config
-MVC
+Controllers
+Models
+Views
-Library
-router.class.php
-.....
+public
- css
-img
- js
- file
.htaccess
index.php

desatir7316
سه شنبه 03 مرداد 1391, 10:45 صبح
1-
http://www.nathandavison.com/posts/v...1-introduction

2-
http://johnsquibb.com/tutorials/mvc-...-hour-part-one



3-
http://www.phpro.org/tutorials/Model...oller-MVC.html


دوستان عزیز به نظر من لینک دوم خیلی راحت و خوب توضیح داده
نظرتون چیه که باهم روی مراحل توضیح داده شده توی همین لینک پیش بریم و در هر جا ابهامی بود یا نکته ای چیزی مطرح کنیم و بتونیم همینو برای گام اول کامل کنیم
یا نظرتون در مورد ترجمه همین لینک چیه؟ حالا برای بخش بندیش با هم هماهنگ میکنیم، نهایتا هم یه آموزش در این زمینه به زبان پارسی آماده کردیم

Mahmoudzadeh.A
سه شنبه 03 مرداد 1391, 13:55 عصر
خب اصلا چرا MVC?


تا حالا اگه چند تا پروژه نوشته باشید متوجه هستید که هر وقت که پروژه شما ساخت یافته تر هست ، امنیت، مدیریت ، توسعه و ویرایش اون راحت تر هست و هر وقت که مخلوط و درهم برنامه نویسی می کنید توسعه و ویرایش و امنیت اون پایئن تر هست.

......

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

هدف الگوی MVC هم دقیقا همین هست:
- همه بخش هایی که بانک داده ها مثل mysql,sql,access,oracel و غیره و یا سایر منابع داده مثل فایل ها و یا منابع داده ای در حال اجرا مثل ارایه ها و ... سرو کار دارند در لایه model قرار می گیرند.

- همه ی بخش هایی که با نحوه چگونگی نمایش اطلاعات رو برای کاربر سرو کار دارن در لایه view قرار می گیرد.

- حا لا بخشی که باید این دو لایه رو کنترل کنه و داده های لازم رو در ویو های مناسب قرار بده در لایه کنترل قرار می گیرد.

- یک بخش دیگه هم هست که درخواست های ارسال شده به سرور رو پردازش می کنه و بر اساس پردازش کنترل مناسب رو انتخاب می کنه

حالا قضاوت کنیم کلیه کد های sql در یک لایه ، کلیه فایل های نمایش در یک لایه دیگر هست و همه چیز منفک.


---------------------------------------------------
در مرحله بعد به پیاده سازی لایه کنترلر می پردازیم......

colors
سه شنبه 03 مرداد 1391, 23:36 عصر
درود

ممنون از اینکه زحمت میکشید و این مطالب رو در اختیار همگان قرار میدید.
اگه اشکالی نداره یه انتقادی بکنم:
اگه قراره مث همه آموزشهای MVC فقط در مورد سه لایه m,v,c صحبت کنید و نحایتا یه پروژه بسازید که hello world رو چاپ کنه، همین الان ادامه ندید راحترید. چون حداقل فکر کنم 5 تا پست تو همین فروم در مورد اینا هست.

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

بازم تشکر واسه زحماتتون.

Mahmoudzadeh.A
چهارشنبه 04 مرداد 1391, 00:36 صبح
سلام جناب colors (http://barnamenevis.org/member.php?181541-colors)
از وقتی این تاپیک رو زدم همینجوری ایراد میاد از در و دیوار .یک مقداری هم در این ماه عزیز روحیه بدید.

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

در مورد مثال ها هم روال اینجوری هست که ابتدا از همون مفاهیم خیلی ساده شروع می کنیم ، بعد به سراغ شرح تک تک لایه ها می ریم .

در ادامه به سراغ پیاده سازی ساده این لایه ها می رویم.برای روشن تر شدن موضوع یک پروژه کوچک رو ارائه می کنیم.

در نهایت یه پروژه تاپ که البته میشه پیشنهاد ها رو بررسی کرد با مدل MVC و بدون استفاده از هیچ فریمورکی ، از صفر و ب بسم اله پیاده سازی می کنیم.حالا این پروژه می تونه یک سیستم ارسال خبر، فروشگاه، Cms ، سایت ارسال و مدیریت مقاله و .... باشه.

این پروژه final می تونیم با کمک هم تعیین کنیم و ببریم جلو.ولی من حتما اصرار دارم که از مفاهیم صفر و پروژه های ساده شروع کنم و تا آخرش برم.که هر کس آشنایی با الگوی MVC نداشت ، این تاپیک بتونه یه مرجع خوب براش باشه.

از شما دوستان هم برای شرکت و پیشبرد این تاپیک دعوت می کنم و خوشحال می شم که همه مشارکت داشته باشیم.
---------------------------
حا لا اگه دوستان موافق نیستن همین جا stop کنیم.:متعجب:

desatir7316
چهارشنبه 04 مرداد 1391, 01:11 صبح
از وقتی این تاپیک رو زدم همینجوری ایراد میاد از در و دیوار .یک مقداری هم در این ماه عزیز روحیه بدید.

والا من خودم خیلی دلمه مشارکت کنم ولی مشکل اینجاست که اطلاعاتی در این رابطه ندارم و می ترسم برنامه پیشروی تاپیک رو به هم بزنم

من که نخواستم مغرورانه این تاپیک رو یه نفره ببرم جلو از همه دعوت کردم که مشارکت کنن.
در حسن نیت شما که شکی نیست ولی من فکر می کنم جناب colors به این خاطر این پست رو فرستادن چون از تاپیک های آموزشی که اول شروع می شن و بعد از یه مدت به امان خدا رها می شن خیلی زیاده و اینجوری اصلا خوب نیست البته اینشالله که ایندرتاپیک اینجوری پیش نمیره البته با کمک همه بچه ها


لا اگه دوستان موافق نیستن همین جا stop کنیم
والا من که خودم شخصا دلم نیست این تاپیک متوقف بشه ولی برای خودم سواله که چرا کاربرا از این تاپیک حمایت نمی کنن
نمی دونم مشکل کجاست
روز اول که این تاپیک رو دیدم فکر می کردم همه میریزن سرش و جا واسه ما دیگه نمی مونه

Variable
چهارشنبه 04 مرداد 1391, 02:28 صبح
خیلی ها آشنایی ندارن مثله من که مبتدی هستیم . من فکر میکنم دوستان منتقد دید کلی و جامع داشته باشن.
و برای اون دسته از دوستان هم که آشنایی دارن یه تاپیک زده بشه
که موضوعات پیشرفته تررو درش بحث کنند

Mahmoudzadeh.A
جمعه 06 مرداد 1391, 00:39 صبح
کنترلر ها دارای تعدادی صفات مشترک هستند .برای اینکه نگاهی شی گرا تر داشته باشیم ابتدا یک کلاس کنترلر پایه ایجاد می کنیم و در گام بعدی همه ی کنترلر های لازم رو از این کلاس پایه مشتق می کنیم.اما از آنجا که لازم نیست شی ای از این کلاس پایه ایجاد کنیم و فقط به عنوان یک طرح کلی هست بنابراین به صورت abstract تعریف می کنیم.




<?php
abstract class BaseController
{
protected $model;
protected $view;
protected $language;

public function __construc($language)
{
$this->language=$language;
}


abstract public function index();
}
?>


به این علت $model , $view رو به صورت Protected انتخاب کردم که فقط در کلاس های مشتق شده از این کلاس قابل دسترسی باشند و از خارج غیر قابل دستیابی باشند.

--------------------------------------
در ادامه به مطالب جذابتر و کاملتر خواهیم رسید.مثال های سبکی هم خواهیم زد اما یک پروِژه نسبتا عالی هم با این الگو پیاده سازی می کنیم(ان شاءاله) اما باصبر...

nooshzad_parto
یک شنبه 08 مرداد 1391, 00:12 صبح
آقای محمود زاده لطفا ادامه دهید ولی خواهشا وسط راه رها نکنید

Variable
جمعه 13 مرداد 1391, 13:34 عصر
بله
لطفا ادامه بدید . یا اینکه یه منبع درست و سالم به ما معرفی کنید.

Mahmoudzadeh.A
جمعه 20 مرداد 1391, 22:05 عصر
سلام!چشم نترسید تا آخرش ادامه می دم.راستش یه چند تا مشکل برام پیش اومد و یه پروژه هم دارم که باید تحویل بدم برای همین نتونستم زیاد وقت کافی بزارم که از این بابت معذرت خواهی می کنم.

از همین حالا هم بگم که تا حدودا یک ماه دیگه هم درگیر این پروژه هستم ولی سعی می کنم مباحث رو تکمیل کنم.اما می رویم سراغ پیاده سازی کنترلر ها .در ضمن سعی می کنیم که مثال ما به صورت چند زبانه باشه




include 'BaseController.php';
class Home extends BaseController
{

public function __construct($language='fa',$action='index',$param1 ='',$param2='')
{
parent::__construct($language);
switch($action)
{
case 'index':
$this->index();
break;
default:
}
}

public function index()
{
$this->view=new Home_View($this,$this->language);
}

public function __destruct()
{

}
}


خب اما بریم سراغ توضیح کد:
ابتدا طبق قرار مون که ویژگی های مشترک رو در یک کلاس پایه قرار دادیم بنابراین این کلاس پایه (BaseController) رو Include می کنیم.

حالا برای سایت مون یک صفحه اول به نام home در نظر می گیریم .این صفحه قاعدتا دارای یک کنترلر است که در آن تعدادی action مانند index و .... هست.دارای یک ویو و یک لایه مدل.خب ما اسم این کنترلر رو home می نامیم و این کلاس رو از کلاس پایه مشتق می کنیم.

در ادامه سازنده کلاس پایه رو فراخوانی می کنیم تا بتوانیم مقدار دهی های اولیه رو انجام بدیم.

یک switch در نظر می گیریم که بر مبنای action ورودی تابع مناسب رو انتخاب کنیم.

- به سراغ تابع Index می رویم .راستی کلاس BaseController رو که یادتون نرفته تعدادی فیلد مشترک داشت یکی از این ها this->view هست که در کلاس فرزند به آن با استفاده از ایجاد یک شی از لایه ویو مقداری می دهیم.البته بعدا مفصلا در مورد Home_view توضیح می دم.

یه چیز دیگه که یادم رفت در مورد پارامتر ها هست:

یادآوری:گفتیم که هر آدرس در الگوی MVC به صورت زیر هست.


https://localhost/Mysite/controller/action/param1/param2/....


حالا ما آدرس ها رو در یک کلاس router تجزیه می کنیم و بر اساس نام کنترلر ، کلاس مناسب رو فراخوانی می کنیم و action و سایر پارامتر ها رو به سازنده آن انتقال می دهیم که این همه اتفاقات بیرون این کنترلر می افته و فعلا درگیر اون نشید.

farhadfery
شنبه 21 مرداد 1391, 00:10 صبح
سلام. عزیز می شه منبع خودتون را معرفی کنید؟
این هست؟
https://github.com/negative11

raha1986
چهارشنبه 25 مرداد 1391, 22:53 عصر
سلام جناب colors (http://barnamenevis.org/member.php?181541-colors)
از وقتی این تاپیک رو زدم همینجوری ایراد میاد از در و دیوار .یک مقداری هم در این ماه عزیز روحیه بدید.



در نهایت یه پروژه تاپ که البته میشه پیشنهاد ها رو بررسی کرد با مدل MVC و بدون استفاده از هیچ فریمورکی ، از صفر و ب بسم اله پیاده سازی می کنیم.حالا این پروژه می تونه یک سیستم ارسال خبر، فروشگاه، Cms ، سایت ارسال و مدیریت مقاله و .... باشه.

این پروژه final می تونیم با کمک هم تعیین کنیم و ببریم جلو.ولی من حتما اصرار دارم که از مفاهیم صفر و پروژه های ساده شروع کنم و تا آخرش برم.که هر کس آشنایی با الگوی MVC نداشت ، این تاپیک بتونه یه مرجع خوب براش باشه.

از شما دوستان هم برای شرکت و پیشبرد این تاپیک دعوت می کنم و خوشحال می شم که همه مشارکت داشته باشیم.
---------------------------
حا لا اگه دوستان موافق نیستن همین جا stop کنیم.:متعجب:


سلام
تو رو خدا متوقف نکنین
من با چه ذوقی این تاپیک رو شروع کردم که یدفعه تهش شد این
خوب راست میگن، اول مفاهیمه دیگه!
کلی گشتم ببینم یکی میگه دقیقا این MVC چیکار میکنه!

والا اگه پروژه میخواین من تا دلتون بخواد ایده دارم!
که همه چی هم توشه!
راستش رو بخواین من دارم تزم رو پیاده میکنم که تو پیاده سازیش کلی گیر کردم، کدهام تیکه تیکه است و نمیتونم سرهم بندی کنم
و آخرش هم تصمیم گرفتم با این MVC کار کنم و اون هم بخاطره ها View هایی که میتونه خودشون رو با Screen های مختلف تطبیق بده

راستش کلی گشتم یکی کمکم کنه هیچکس حاضر نیست کمک کنه!
میشه این تاپیکتون رو راه بندازین لطفا
من بهش احتیاج دارم

Mahmoudzadeh.A
جمعه 27 مرداد 1391, 17:46 عصر
سلام!
خب بریم سراغ کلاس BaseView:
اسم فایل رو BaseView.view.php قرار می دیم.



abstract class BaseView
{
protected $controller;
protected $file;
protected $indexed_lang=array('en'=>'English','fa'=>'persian');
protected $language;

public function __construct(BaseController $controller, $language)
{
$this->language=$language;
$this->controller=$controller;
}


public function __destruct()
{

}

]


خب این هم مشابه کنترلر ها بود که یک کلاس پایه داشتن و در ادامه بقیه ویو ها رو از این کلاس پایه مشتق می کنیم.
در سازنده این کلاس دو فیلد ورودی داریم یکی از نوع کنترلر و دیگری زبان (گفتیم که می خواهیم مثالمون رو دو زبانه پیاده سازی کنیم.البته حتما یادتون باشه که بعدا بپرسید چرا یک شی کنترلر به داخل ویو می فرستیم؟

اما کلاس Home_view:این کلاس رو به نام home.view.php قرار می دیم.




<?php

include 'BaseView.View.php';

class Home_View extends BaseView
{

/**
*
*
*@The Constructor Function
**/
public function __construct(BaseController $controller,$language)
{
parent::__construct($controller,$language);

$this->file=Views.'/home/home.php';

$this->index();
}


// index function
public function index()
{


if($this->language=='fa')
{
include Persian;
$dir='RTL';
}
else if($this->language=='en')
{
include English;
$dir='LTR';
}

// render file
include $this->file;
}

public function __destruct()
{

}
}

?>


همه چیز واضح است فقط در مورد $this->file; بگم که آدرس فایل ویو هست که باید لود بشه منظورم همون صفحه اول هست.
خب در تابع index بررسی می کنیم که نوع زبان چی هست فارسی یا انگلیسی بعد اونو لود می کنیم و در نهایت ویو مورد نظر با زبان انتخابی ما لود میشه.
Persian و English دو متغیر سراسری هستند که آدرس فایل های ترجمه زبان ها می باشند و در فایل config قرار داره و بعدا می گم که این فایل چه طوری هست و چه طوری باید فراخوانی بشه.(مرحله به مرحله).

Mahmoudzadeh.A
جمعه 27 مرداد 1391, 18:13 عصر
خب به سراغ پیاده سازی ویو ی صفحه ی اول می رویم.همیشه سعی کنید اجزاءای که پیاده سازی می کنید از هم منفک باشه تا بتوانید بهتر؛ آسانتر ، و باکیفیت و سرعت بالاتر اون ها رو ویرایش، اپدیت وتوسعه دهید.
برای مثال اگه در هر صفحه ای که پیاده سازی می کنید بخش footer رو عینا به اخر هر صفحه کپی کنید اینجوری که سایت شما مثلا سی صفحه باشه و بعدا یادتون بیفته که footer رو باید ویرایش کنید کلی دردسر ایجاد میشه بنابراین بهتر هست یک footer داشته باشید و بعد اونو به انتهای هر صفحه include کنید.اگر هم بخواهید ویرایش کنید فقط یک بار لازم هست.

از همین استراتژی استفاده می کنیم صفحه اول رو بخشهایی تقسیم می کنیم مثلا من می خواهم یک فرم در صفحه اول باشه که نام و نام خانوادگی و ... رو بگیر ه و به یک صفحه دیگه ارسال کنه و یا یک کاری رو انجام بده

پس من صفحه خودم رو به سه بخش تقسیم می کنم.header,home_frm,footer .دوبخش header,footer‌که بین اکثر صفحات سایت مشترک هست اما home_frm:





<form method="POST" id="mvcForm">
<div class="row"><!--Fname-->

<label for="Fname"><?php echo $Lang['Fname'];?>*:</label>
<input type="text" size="15" id="Fname" name="Fname"/>

<div class="note">
<span id="note-Fname"><?php echo $Lang['Error_Fname'];?></span>
</div>

</div><!--Fname-->


<div class="row"><!--Lname-->

<label for="Lname"><?php echo $Lang['Lname'];?>*:</label>
<input type="text" size="15" id="Lname" name="Lname"/>

<div class="note">
<span id="note-Lname"><?php echo $Lang['Error_FullName'];?></span>
</div>

</div><!--Lname-->


<div class="row">

<input type="button" value="<?php echo $Lang['signup'];?>" name="submit"
id="submit" class="sub-btn" tabindex="16" onclick="ValidationForm('<?php echo
$this->language;?>');">
</div>
</form>


اونجاهایی که عبارتهایی مشابه این <?php echo $Lang['signup'];?> می بینید کارش ترجمه کردن صفحه هست یعنی اگه
$this->language رو یادتون بیاد اگه برابر 'fa ' باشه معادل فارسی چاپ میشه و اگه انگلیسی باشه .....
کاری که ما به طور ساده انجام داده ایم اینه که از سایت دو ترجمه در دو فایل جداگانه persian.php, english.php به صورت یک آریه Lang انجام داده ایم و هر جا که لازم هست زبان مورد نظر انتخاب میشه و محتوا به آن زبان نمایش داده میشه.در این باره در پست های بعدی بیشتر صحبت می کنیم.

djsaeedkhan
سه شنبه 31 مرداد 1391, 19:18 عصر
سلام دوستان
حیفه این تاپیک هم فراموش بشه
من یه پروژه MVC خیلی ساده داشتم. اونو میذارم اینجا. برای دوستایی که میخوان یه تصوری از MVC داشته باشن خوبه.
همچنین می تونید همین رو گسترش بدید و مث خود من که از این سورس خییلی ساده برای یه پروژه بزرگ استفاده کردم. شما هم استفاده کنید.
فقط پروژه رو تو ومپ کپی کنید و اجراش کنید. دیگه کد های درج و .... رو اگر دوستان گذاشتن که هیچ. نذاشتن میذاریم.