107
تشکر

مدل MVC در PHP – قسمت اول

PHP - پی اچ پی

PHP – پی اچ پی

مدل MVC یا Model-View-Control در اواخر سال 1970 شکل گرفت که الگوی نرم افزاریی بود که بر اساس ارائه اطلاعات جدا از متدهایی که با داده ها در ارتباط هستند ساخته شد. به عنوان یک توسعه دهنده سیستم MVC باید این اجازه را برای توسعه دهندگان front-end و back-end ایجاد کرد که هر دو طرف بتوانند با سیستم کار کنند بدون اینکه بخواهند در فایلها دخالت, اشتراک و یا تغییری ایجاد کنند.

با اینکه این سیستم در ابتدا برای محاسبات شخصی طراحی شده بود, اما بسیاری از توسعه دهندگان وب با اقتباس از این سیستم به طور گسترده ای از آن استفاده میکنند. دلیل آن هم تاکید این سیستم بر جدا بودن بخش ها است که به صورت غیر مستقیم باعث میشود که کدهای ما قابل استفاده مجدد باشند. این مدل به توسعه دهنگان این اجازه را میدهد که خیلی سریع توابع را آپدیت,  ویرایش و اضافه کنند.

در این مطلب ما به اصول مدل MVC میپردازیم و یک مثال سریع از MVC در PHP میزنیم. این مطلب برای کسانی که قصد آشنایی با برنامه نویسی به سبک MVC دارند مناسب است.

برای درک MVC باید با برنامه نویسی به روش شیء گرا آشنا باشید.

درک MVC

این الگو از سه بخش اصلی Model و Controller و View تشکیل شده است. نمودار این مدل را بر اساس ویکی پدیا مانند زیر است:

مدل MVC

مدل MVC

این تصویر رابطه های مختلف بین بخش ها را به خوبی نشان میدهد.

Model

 

بخش Model بخشی برای ذخیره سازی داده های دائمی است. این بخش این اجازه را میدهد که داده ها نمایش, جمع آوری یا نوشته شوند. همچنین پلی است بین بخش View و Controller در طرح کلی.

نکته مهم این است که این بخش از اتفاقاتی که در بخش های Controller و View می افتد هیچ دانش و اطلاعاتی ندارد. این بخش به دنبال پاسخ از دیگر بخش ها نیست و تنها هدف آن ذخیره سازی دائمی داده ها یا آماده سازی آنها برای انتقال به بخش های دیگر است.

این بخش داده ها را درون خود نگه میدارد, هیچ سوالی نمیکند اما به درخواست ها پاسخ میدهد. اغلب سختی که در بخش Model وجود دارد این است که با توجه به اینکه در همه سیستم ها در اوج است اما هیچ ارتباطی با بخش های دیگر ندارد.

View

 

در این بخش داده ها را از Model درخواست, و داده های نهایی را به عنوان خروجی نمایش میدهیم. به صورت سنتی در مدل MVC, بخش View جهت تولید کدهای HTML برای نمایش داده ها استفاده میشود. این بخش توسط کاربر فعال میشود که با بخش Controller در ارتباط است. برای مثال یک دکمه که توسط بخش View تولید شده است, کاربر روی آن کلیک میکند که باعث میشود بخش Controller عمل خاصی را انجام دهد.

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

علاوه بر این گفتن این که بخش View یک فایل Template است نادرست است. اما این اشتباهات تقصیر یک نفر نیست. در واقع بسیاری از توسعه دهندگان به شکل نادرستی یاد میگیرند و به همان روش یاد میدهند.

Controller

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

به صورت خلاصه این بخش داده ها را جمع آوری میکند و آن را برای ذخیره سازی به Model میدهد

MVC در PHP

در زیر به ساختمان اصلی مدل MVC در PHP میپردازیم. قرار نیست ما در این سری از مطالب برنامه نویسی شیء گرا را آموزش دهیم. پس ما فرض بر این میگیریم که شما برنامه نویسی OOP را یاد دارید(آشنایی جزئی کافی است).

  class Model{
    public $string;
    
    public function __construct(){
      $this->string = "MVC + PHP = Awesome!";
    }
  }
  class View{
    private $model;
    private $controller;
    
    public function __construct($controller, $model){
      $this->controller = $controller;
      $this->model = $model;
    }
    
    public function output(){
      return "<p>" . $this->model->string . "</p>";
    }
  }
  class Controller{
    private $model;
    
    public function __constrauct($model){
      $this->model = $model;
    }
  }

خوب پروژه ما با نوشتن ساختمان اصلی این مدل شروع شد. حالا ما باید ارتباط های بین آن ها را درست کنیم.

  $model = new Model();
  $controller = new Controller($model);
  $view = new View($controller, $model);
  echo $view->output();

همانطور که در مثال بالا میبینید هیچ تابع خاصی در بخش Controller نداریم زیرا ما در برنامه خودمان هیچ تعریفی از تعامل کاربر تعریف نکردیم. و بخش View هدف ما را برای نمایش اجرا میکند.

بزارید برنامه را کمی گسترش دهیم تا نشان دهیم یک قابلیت به Controller اضافه کنیم و با این کار تعامل را به اپلیکیشن اضافه میکنیم.

  class Model{
    public $string;
    
    public function __construct(){
      $this->string = "MVC + PHP = Awesome!";
    }
  }
  class View{
    private $model;
    private $controller;
    
    public function __construct($controller, $model){
      $this->controller = $controller;
      $this->model = $model;
    }
    
    public function output(){
      return '<p><a href="mvc.php?action=clicked" >' . $this->model->string . '</a></p>';
    }
  }
  class Controller{
    private $model;
    
    public function __construct($model){
      $this->model = $model;
    }
    
    public function clicked(){
      $this->model->string = "Update Data, tanks to MVC and PHP!";
    }
  }

خب در برنامه قابلیتی اضافه شده است. در این مثال میبینید که به چه صورت زیبایی (برای من زیباست!) بخش Controller با بخش Model ارتباط برقرار کرده است. خوب ارتباط بین بخش ها به صورت زیر میشود:

  $model = new Model();
  $controller = new Controller($model);
  $view = new View($controller, $model);
  
  if (isset($_GET['action']) && !empty($_GET['action'])) {
      $controller->clicked();
  }

  echo $view->output();

برنامه را اجرا کنید و با کلیک بر روی اولین جمله میبینید که پاسخ مناسب نمایش داده میشود.

نتیجه گیری

هنوز راه طولانی در MVC داریم. در مطلب بعد به گسترش MVC خواهیم پرداخت.

مدل MVC در PHP – قسمت دوم

  • علی می‌گه:

    بنده با 9 سال سابقه کار در زمینه طراحی نرم افزار های آنلاین هنوز هم طرف MVC نرفتم چون دردسر چیزی برای ما نداشته و فقط با codeigniter اونم با function کار کردم

    کار با MVC به دردسرش نمی ارزه

    • سعید می‌گه:

      تغییر همیشه هم اونقدر که فکر میکنیم بد نیست !
      شما واردش بشو ، بعدش قضاوت کن و قاطع بیان کن نظرت رو
      ربطی هم به تعداد سال ها (9!) نداره

  • حمید می‌گه:

    سلام
    ممنون از زحمتتون
    کد بالا در قسمت foreach مشکل دارد، چون ایندکس های دوم خودشون آرایه هستن نیاز به یک کد اضافه هست 😉

  • Osman Makhtoom می‌گه:

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

  • آرین تشکر می‌گه:

    خیلی عالی بود محسن عزیز !
    من با همه موارد آشنا هستم ولی فقط نمی دونم چطوری می تونم از مدل MVC توی پروژه های طراحی وب استفاده کنم یعنی مثلا در بالا شما PHP رو توضیح دادید …

    ممنونم :)
    موفق باشید …

  • majid می‌گه:

    با سلام
    خیلی آموزشت خوب بود… پایه ی MVC یاد گرفتن من رو از سایت و آموزش شما گذاشته شد امشب…ممنون
    البته اگه میشه داخل مطلبت اعلام کن که فایل تست ای کدها رو به نام “mvc.php” ذخیره کنن،چون من خودم بخاطر عادت همون “index.php” ذخیره کردم و داشتم ناامید میشدم :)))))
    بازم ممنون

  • سبحان می‌گه:

    داداش منبع هم بزار ! اینجور خوب نیستا !
    ====
    بد نیست ی تشکری هم از استاد شهرکی میکردی !
    فقط به فکر وبلاگ خودت نباش !

    • محسن شفیعی می‌گه:

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

  • حامد می‌گه:

    آفرین

  • سعید می‌گه:

    محسن جان خیلی مطلبت عالی و خوب بود ممنون از تلاشی که بابتش کشیدی
    ای کاش کاراتو به شکل یک فایل pdf در می آوردی !‌
    موفق باشی


  • نظرات این مطلب بسته است.