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

تعریف کلی مدل در چارچوب MVC

چارچوب MVC از برنامه نویسی شی گرا استفاده کرده و به شدت به آن مقید است. تا جایی که اجازه نمی دهد هیچ دستوری خارج از روش شی گرا نوشته شود. در دو بخش قبل با برنامه نویسی شی گرا در PHP آشنایی مقدماتی پیدا کردید، انتظار است با مطالعه مثال های مختلف از شی گرایی و کدنویسی آن آمادگی لازم برای شروع یادگیری MVC را پیدا کرده اید.

بخش مدل (model) از چارچوب MVC وظیفه دریافت درخواست ها از بخش کنترولر و اجرای آنها روی بانک اطلاعاتی و آماده کردن و برگرداندن نتایج به کنترولر را برعهده دارد.  به این صورت که برای هر درخواست مربوط به بانک اطلاعاتی دارای یک تابع است، و در داخل این تابع، بسته به اینکه درخواست چه باشد، یک دستور به زبان SQL روی بانک اطلاعاتی اجرا می کند. درخواست ممکن است برای درج، حذف، ویرایش رکورد و یا خواندن تمام یا بخشی از رکوردهای یک جدول یا الحاق چند جدول باشد.

برای پیاده سازی مدل نیاز به آشنایی دستورات اصلی SQL دارید ، برای پیداکردن این آشنایی می توانید از مطالب این سایت استفاده کنید.

طراحی مدل برای MVC

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

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

tbl_studs( sid , name , avgr , fid )

tbl_ields( fid , fname )

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

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

جدول رشته ها

  • خواندن کل مشخصات رشته ها
  • اضافه کردن رشته
  • حذف رشته بر اساس شناسه
  • خواندن مشخصات یک رشته بر اساس شناسه برای ویرایش
  • ثبت تغییرات رشته پس از ویرایش

جدول دانشجویان

  • خواندن مشخصات همه دانشجویان
  • خواندن مشخصات یک دانشجو بر اساس شناسه دانشجو
  • خواندن مشخصات همه دانشجویان مربوط به یک رشته بر اساس شناسه رشته
  • خواندن مشخصات دانشجویان بر اساس نام یا بخشی از نام آنها
  • اضافه کردن یک دانشجو
  • حذف دانشجو بر اساس شناسه
  • ثبت مشخصات جدید دانشجو بعد از ویرایش

همانطور که در مثال فوق می بینید باید درخواست ها را آنقدر جزئی بنویسیم که برای اجرای هر کدام فقط یک دستور SQL کافی باشد.

ساختار فایل های مدل در MVC

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

پیاده سازی مدل برای MVC با PHP

 

model.php

stud_model.php

field_model.php

فایل model.php

فایل model.php حاوی یک کلاس برای نگهداری توابع اصلی و عمومی که برای همه جداول لازم است. در این کلاس باید حداقل توابع برای موارد زیر وجود داشته باشد.

  • اتصال به بانک اطلاعاتی
  • اجرای یک دستور بازیابی (Select) روی بانک اطلاعاتی .
  • اجرای یک دستور برای اجرای دستورات غیر بازیابی مثل درج، حذف ، ویرایش و غیره
  • واکشی یک سطر از نتیجه پرس وجوی اجرا شده.

شما با برنامه نویسی بانک اطلاعاتی به زبان PHP آشنایی دارید و می دانید که در این زبان برای کار کردن با هر نوع بانک اطلاعاتی مجموعه ای از دستورات با پیشوند مشخص دارد، بعنوان مثال تمام دستورات PHP که روی بانک اطلاعاتی MySQL اجرا می شوند دارای پیشوند mysql_ هستند مثل mysql_connect و … و یا دستوراتی که روی مایکروسافت اس کیو ال سرور اجرا می شوند دارای پیشوند mssql می باشند مثل mssql_connect و غیره. یک پیشنهاد این است که برای هر دستور لازم دارای چنین پیشوندی که خاص یک بانک اطلاعاتی است، در فایل model.php یک تابع تعریف شود. به این صورت این دستورات خاص فقط در فایل model.php قرار گرفته و در هیچ فایل دیگری از پروژه وجود نخواهند داشت در نتیجه در صورت تغییر نرم افزار بانک اطلاعاتی در آینده فقط کافی است فایل model.php را بازنویسی کنید.

با این مقدمه پیشنهاد برای model.php به صورت زیر است:

<?php
class model
{
protected $conn;
public function __construct()
{
$this->conn = mysql_connect("localhost", "root" , "" );
mysql_select_db( "amoozesh", $this->conn);
mysql_query("SET NAMES utf8 " , $this->conn);
}
public function execQuery($sql)
{
$res = mysql_query( $sql , $this->conn);
return $res;
}
public function getAll($sql)
{
$res = mysql_query( $sql , $this->conn);
$rows=array();
while ( $row=mysql_fetch_assoc($res))
$rows[]=$row;
return $rows;
}
public function getRow($sql)
{
$res = mysql_query( $sql , $this->conn);
$row=mysql_fetch_assoc($res);
return $row;
}
}
?>

فایل model.php دارای یک کلاس به نام model است که در آن:

  • متغیر بنام $conn برای نگهداری اتصال به بانک تعریف شده است.
  • تابع سازنده (__contruct) که در دستورات آن بصورت خودکار اجرا می شود، این دستورات برای اتصال به سرویس دهنده بانک اطلاعاتی، انتخاب بانک و انتخاب کدگذاری اتصال هستند.
  • تابع execQuery برای اجرای یک دستورSQL روی بانک اطلاعاتی استفاده می شود.
  • تابع getAll برای اجرای یک دستور Select روی بانک اطلاعاتی و قراردادن نتایج در یک آرایه استفاده می شود.
  • تابع getRow برای اجرای یک دستور select محدود شده بر اساس کلید اصلی و استخراج سطر و برگرداندن رکورد استفاده می شود.

فایل stud_model.php

برای رعایت اختصار و قابل فهم بودن در پیاده سازی کلاس مدل برای دانشجو، فعلاً فقط عملکردهای اصلی را پیاده سازی می کنیم شامل:

  • خواندن مشخصات همه دانشجویان
  • اضافه کردن دانشجو
  • حذف دانشجو
  • ویرایش دانشجو

فایل مدل دانشجویان، دارای یک کلاس بنام stud_model است که از کلاس model ارث بری دارد و دارای توابعی برای پیاده سازی درخواست های مختلف مربوط به جدول دانشجویان است. ما فایل زیر را پیشنهاد می کنیم:

<?php
class stud_model extends model
{
public function getRows()
{
$rows = $this->getAll("SELECT * FROM tbl_studs");
return $rows ;
}
public function getRowById($sid)
{
$sql = "SELECT * FROM tbl_studs WHERE  sid =$sid";
$row = $this->getRow($sql);
return $row;
}
//.....
public function insert($name,$avgr,$fid)
{
$sql="INSERT INTO tbl_studs(name,avgr,fid) VALUES('$name',$avgr,$fid)";
$this->execQuery($sql);
}
//.....
public function update($name,$avgr,$fid,$sid)
{
$sql="UPDATE tbl_studs SET name='$name',avgr=$avgr , fid=$fid  WHERE sid=$sid";
$this->execQuery($sql);
}
public function delete($sid)
{
$sql="DELETE FROM tbl_studs WHERE sid=$sid";
$this->execQuery($sql);
}
}
?>

در ابتدا برای ارث بری کلاس ها از کلمه extends استفاده شده است:

class stud_model extends model {  .. }
  • تابع getRows برای خواندن مشخصات همه دانشجویان استفاده می شود و تابع getAll از کلاس پدرش را فراخوانی می کند و یک دستور Select به آن می دهد تا کل مشخصات دانشجویان بصورت یک آرایه بدست آورد و نتیجه را برمی گرداند.
  • تابع getRowById یک شماره دانشجویی گرفته و دستور select مناسبی ایجاد کرده و تابع getRow از کلاس پدرش را فراخوانی می کند تا مشخصات یک رکورد را بدست آورده و برگرداند.
  • تابع insert ، مشخصات دانشجو را به عنوان پارامتر گرفته و با ساخت یک دستور INSERT به زبان SQL آنرا اجرا می کند.
  • تابع delete، شناسه دانشجو را بعنوان پارامتر گرفته و دستور DELETE به زبان SQL آنرا اجرا می کند.
  • تابع update، مشخصات دانشجو را بعنوان پارامتر گرفته و دستور UPDATE به زبان SQL آنرا اجرا می کند.

برای پیاده سازی فایل مدل رشته ها (field_model.php ) هم دقیقاً مثل جدول دانشجویان عمل می کنیم. کافی است از فایل stud_model.php یک نسخه ایجاد کرده و تمام کلمات stud را با field عوض کنیم و پارامترهای توابع و دستورات SQL را متناسب با جدول رشته ها اصلاح کنیم.

 

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

نمایش قابل چاپ