آموزش MVC در زبان برنامه نویسی PHP

15 اسفند 1395
3

امروزه الگوی MVC (مخفف عبارت Model View Controller) در اکثر برنامه‌ها و نرم‌افزارهای تحت وب پیاده‌سازی می‌شود. اولین بار این الگو در زبان برنامه‌نویسی Smalltalk استفاده شد و پس از آن توسط زبان برنامه‌نویسی Java همه‌گیر شد. هم‌اکنون فریم ورک های بسیاری با ساختار الگوی MVC ایجاد شده‌اند. همانگونه که در جریان هستید فریم‌ورک‌های بسیاری بر مبنای زبان برنامه‌نویسی PHP وجود دارند که از این الگو پیروی می‌کنند. بنابراین یک واقعیت بسیار بزرگ وجود دارد و آن محبوبیت الگوی MVC در زبان برنامه نویسی PHP است. لذا برآن شدیم آموزشی به زبان فارسی در ارتباط با الگوی MVC در PHP خدمت شما دوستان عزیز ارائه دهیم.

الگوی MVC توسط سه بخش Model, View و Controller تفکیک می‌شود:

Model، وظیفه‌ی مدیریت اطلاعات و داده‌ها را به عهده دارد. به عبارت دیگر این قسمت وظیفه‌ی ذخیره‌کردن و بازگردانی اطلاعات موجود از پایگاه داده (Database) و انجام برخی اعمال منطقی بر روی آنها را به عهده‌ دارد.

View، وظیفه‌ی نمایش اطلاعات تولید شده توسط Model‌ را بر عهده داشته تا آن را در یک فرمت و شمایل خاص به کاربران نمایش دهد.

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

در تصویر زیر یک دیاگرام مشاهده می‌کنید که به صورت کامل رابطه‌ی بین Model, View و Controller را نمایش می‌دهد:

دیاگرام الگوی MVC

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

همانگونه که در تصویر زیر مشاهده می‌کند فولدر نرم‌افزار ما تحت عنوان MVC دارای ۳ فولدر controller, model‌ و view و یک فایل Index.php‌ جهت هماهنگی بخش‌های مختلف است.

مثال فارسی MVC

Controller

Controller به عنوان اولین موجودیت یک نرم‌افزار MVC یک سری درخواست (Request) از کاربر دریافت می‌کند. سپس این درخواست‌ها را به Model ارسال کرده و پاسخی که از Model دریافت کرده را به لایه‌ی View ارسال می‌کند. بنابراین در پوشه‌ی controller‌ تنها یک فایل وجود دارد که با نام Controller.php‌ مشخص شده است. و تمامی فرمان‌های کنترلی یک وب سایت مانند ذخیره کردن، فیلتر کردن و ... در این فایل پردازش می‌شود. اگر نگاهی به فولدرها داشته باشید متوجه خواهید شد که فولدرهای model و view یک فریم‌ورک کوچک با ساختاری متناسب را تشکیل‌ داده‌اند.

فایل Controller.php را باز کرده و کدهای زیر را درون آن قرار دهید:

include_once("model/Model.php");  
  
class Controller {  
     public $model;   
  
     public function __construct()    
     {    
          $this->model = new Model();  
     }   
      
     public function invoke()  
     {  
          if (!isset($_GET['book']))  
          {  
               // درصورتیکه کتابی درخواست نشد لیست تمام کتاب‌ها را نمایش دهد
               $books = $this->model->getBookList();  
               include 'view/booklist.php'; 
          } 
          else 
          { 
               // ارسال و نمایش کتاب درخواستی
               $book = $this->model->getBook($_GET['book']); 
               include 'view/viewbook.php';  
          }  
     }  
}

کلاس Controller دارای یک تابع و سازنده‌ی پیش‌فرض است. این سازنده یک کلاس Model را ایجاد کرده و برابر متغییر لوکال model$ قرار می‌دهد. سپس با تعریف یک تابع تحت عنوان invoke و استفاده از یک شرط چک می‌کند که آیا درخواستی برای نمایش کتاب وجود دارد یا خیر؟ که در صورت عدم ارسال درخواست لیستی از کتابهای موجود را از Model دریافت کرده و در View مربوط به آن (view/booklist.php) را به نمایش می‌گذارد. در غیر اینصورت کتاب درخواستی را به Model ارسال کرده و پاسخ آن را در خروجی View موردنظر (view/viewbook.php) نمایش می‌دهد.

و اما فایل index.php که تمام درخواست‌ها را به Controller محول می‌کند.

بنابراین ویرایشگر خود را باز کرده و فایل index.php را با محتویات ذیل پر می‌کنید:

// index.php file  

include_once("controller/Controller.php");  
  
$controller = new Controller();  
$controller->invoke();

در خط شماره ۳ فایل index.php، فایل Controller.php از پوشه‌ی controller با استفاده از تابع include_once فراخوانی شده است. سپس در خط ۵ یک نمونه‌ی جدید از کلاس Controller ایجاد کرده‌ و در نهایت متد invoke را فراخوانی کرده‌ایم.

 

Model و کلاس‌ها

همانطور که قبلا ذکر شد Model وظیفه‌ی فراهم کردن داده‌ها و انجام اعمال منطقی روی آنها را به عهده دارد. جهت اضافه کردن Model به ساختار نرم‌افزاری خود نیاز به دو کلاس داریم. ۱) Model.php و ۲) Book.php. به کلاس Model در هر بار اجرای برنامه‌ نیازی نیست. کلاس Book به عنوان یک کلاس Entity شناخته می‌شود. در یک نرم افزار با الگوی MVC بهترین روش بدین صورت است که کلاس‌های Entity یا کلاس‌هایی که هویت یک شیء را مشخص می‌کنند توسط Model فراخوانی شوند. بنابراین فایل Model.php‌ را به صورت زیر ایجاد می‌کنیم:

include_once("model/Book.php");  
  
class Model {  
    public function getBookList()  
    {  
        // بخشی جهت شبیه‌سازی داده‌های موجود در دیتابیس
        return array(  
            "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."),  
            "Moonwalker" => new Book("Moonwalker", "J. Walker", ""),  
            "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "")  
        );  
    }  
      
    public function getBook($title)  
    {  
        // استفاده کردن از یک تابع برای دسترسی به تمام کتاب های موجود در دیتابیس 
        $allBooks = $this->getBookList();  
        return $allBooks[$title];  
    }  
      
      
}

همانطور که ملاحظه می‌کنید در فایل فوق ابتدا فایل Book.php را جهت ساخت نمونه‌های اولیه فراخوانی کرده‌ایم. سپس یک تابع تحت عنوان getBookList ایجاد کرده تا تمامی اطلاعات را از داده‌های تولیدی دریافت کند (در دنیای واقعی این اطلاعات در دیتابیس و پایگاه داده ذخیره می‌شوند و دیگر تابع getBookList کاربردی ندارد بلکه از یک کوئری Select‌ استفاده می‌شود). در نهایت نمونه‌های دلخواه را متناسب با فیلدهایی که در کلاس Book وجود دارند ایجاد می‌کنیم. سپس تابع getBook را نوشته و عنوان تمامی کتاب‌ها را باز می‌گردانیم.

بنابراین در فایل Book.php‌ کلاس Book‌ را بدین صورت تعریف می‌کنیم:

class Book {  
    public $title;  
    public $author;  
    public $description;  
      
    public function __construct($title, $author, $description)    
    {    
        $this->title = $title;  
        $this->author = $author;  
        $this->description = $description;  
    }   
}

ٰView

آخرین مرحله تنظیم خروجی و قالب نمایشی اطلاعات است. این اطلاعات توسط Model‌ به شکل‌های متفاوتی مانند: Objects یا XML‌ و Json یا ... بازگردانده خواهند شد. شاید بتوان گفت ساده‌ترین بخش یک نرم افزار با الگوی MVC، بخش View آن است. این بخش از کدهای HTML و المان‌های JavaScript‌ تشکیل می‌شود. در واقع Controller‌ اطلاعات را از طریق Model‌ به یک View خاص ارسال می‌کند. معمولا برای هر فایل یک View مجزا ایجاد می‌کنیم. در این مثال فولدر view دو فایل viewbook.php و booklist.php دارد.

فایل viewbook.php‌ را ایجاد کرده و محتویات کد زیر را درون آن قرار می‌دهیم:

<html>  
<head></head>  
  
<body>  
  
    <?php   
  
        echo 'Title:' . $book->title . '<br/>';  
        echo 'Author:' . $book->author . '<br/>';  
        echo 'Description:' . $book->description . '<br/>';  
  
    ?>  
  
</body>  
</html>

و در نهایت برای فایل booklist.php داریم:

<html>  
<head></head>  
  
<body>  
  
    <table>  
        <tbody><tr><td>Title</td><td>Author</td><td>Description</td></tr></tbody>  
        <?php   
  
            foreach ($books as $title => $book)  
            {  
                echo '<tr><td><a href="index.php?book='.$book->title.'">'.$book->title.'</a></td><td>'.$book->author.'</td><td>'.$book->description.'</td></tr>';  
            }  
  
        ?>  
    </table>  
  
</body>  
</html>

در دو فایل فوق با استفاده از دستورهای مشخص مانند book->author$ به اطلاعات موجود در Model دست پیدا کردیم و آنها را در خروجی هر فایل نمایش دادیم.

به شما تبریک می‌گوییم. یک مثال کاملا کاربردی با استفاده از الگوی MVC در زبان برنامه‌نویسی PHP بوجود آوردید. اما این مقاله را بدون شرح مهم ترین نکات الگوی MVC ترک نمی‌کنیم. بنابراین نکات زیر برای هر زبانی که از ساختار MVC پیروی می‌کند بسیار حائز اهمیت است و می‌‍‌تواند به درک شما از این الگو و معماری ۳ لایه کمک کند:

  • Model و View دو بخش مجزا هستند که نرم‌افزار شما را بسیار انعطاف پذیر می‌کند
  • Model و View به صورت جداگانه قابل تغییر هستند و می‌توان کدهای جدیدی در آنها جایگزین کرد بدون آنکه کلیت نرم افزار تغییر کند
  • هر ماژول Model, View و Controller به صورت جداگانه قابلیت Debugging‌ یا خطایابی دارند و این کار شما را بسیار ساده می‌کند.

توجه: دوستان عزیز آموزش ویدیویی پی اچ پی (PHP) از مقدماتی تا پیشرفته به زبان فارسی + ساخت CMS مشابه وردپرس را می‌توانید با کلیک روی اینجا یاد بگیرید. (این دوره در حال برگزاری است)

آموزش مقدماتی تا پیشرفته PHP7 به همراه ساخت CMS اختصاصی مشابه وردپرس

نویسنده شوید

دیدگاه‌های شما (17 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Persona
03 اردیبهشت 1398
سلام و تشکر بابت مطالب مفیدتون بنده در مبحث شی گرایی مبتدی هستم، قسمتی از مطلب باعث سردرگمیم شده، در قسمتی که فایل کنترلر رو ایجاد میکنیم، در توضیح کدهای داخل کنترلر نوشتید "کلاس Controller دارای یک تابع و سازنده‌ی پیش‌فرض است. این سازنده یک کلاس Model را ایجاد کرده و برابر متغییر لوکال model$ قرار می‌دهد". آیا درستش این نیست که آبجکتی بنام model$ از کلاس Model ایجاد شده؟ ممنون میشم توضیح بدید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمد
13 اسفند 1397
ساده، روان، و کامل با تشکر از زحمات شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حمیدرضا
06 اسفند 1397
سپاس بسیار عالی و مفید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی
16 آبان 1397
ممنون خوب بود . ولی اگه به طور جالب تر از سایتش ترجمه میکردین بهتر بود . ترجمه اونم خلاصه زیاد جالب نیس

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Wizen
10 شهریور 1397
بسیار عالی

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Zahra
17 مرداد 1397
سلام.ببخشید ممکنه یکسری کتاب دراین مورد معرفی کنید؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی مصطفایی
23 تیر 1397
ممنون بابت توضیحات مختصر و جامع

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علیزاده
27 فروردین 1397
سلام من تازه با سایتتون آشنا شدم. خیلی مطالب مفیدی دارید. انشاالله موفق باشید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سیدامیرحسین رسولی
02 فروردین 1397
عالی بود جامع ، ساده و منظم ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

پیکسل بوی
18 بهمن 1396
سلام خدمت شما مطلب بسیار ساده ، مفید و بطور کامل همه چیز رو توضیح داده ممنونم از شما و سایت خوبتون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

شمس
21 آذر 1396
سلام و خسته نباشید گرم.....آموزشتون عالیه....ای کاش یه آموزش هم در مورد شی گرائی میذاشتین

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

کیمیا وردپرس
20 آذر 1396
بسیار عالی بود، ممنون و متشکرم از شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

دنی
16 آذر 1396
با تشکر از پست مفید شما خیلی عالی و ساده و قابل فهم توضیح داده بودین خسته نباشید میگم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

احمد
16 مهر 1396
ساده، رسا، مفید با مثال عملی گویا عالی بود. مرسی

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر
25 شهریور 1396
سلام ممنون دوستان عالی بود

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

رادین
22 اردیبهشت 1396
عالی ... فقط یه اشتباه تایپی دیدم که گفتم بهتون اطلاع بدم اگر نگاهی که فولدرها داشته باشید متوجه خواهید شد که فولدرهای کلمه سوم "که" باید به "به" تغییر داده بشه با تشکر

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
23 اردیبهشت 1396
با تشکر از همراهی شما دوست عزیز ویرایش صورت پذیرفت.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sina
18 اردیبهشت 1396
فوق العاده بود ممنون خسته نباشید. همه فقط توضیح میدن و خبری از مثال کاربردی نیست؛ اما این مطلب عالی بود.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.