40
تشکر

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

PHP – پی اچ پی

PHP – پی اچ پی

این مطلب ادامه مطلب “مدل MVC در PHP – قسمت اول” است. ابتدا این مطلب را مطالعه کنید.

به بخش دوم از این سری از مطالب خوش آمدید. در این مطالب ما در باره ملاحظاتی صحبت میکنیم که شما در زمان طراحی مدل MVC باید در نظر بگیرید. اگر مطلب اول را خوانده اید مطلب دوم را شروع میکنیم.

مسیریابی و URLها

اگر چه مدل MVC یک مدل بسیار خوب برای برنامه نویسی است اما ترکیب آن با وب و PHP ممکن است کمی مشکل دار شود. مشکل اول مسیریابی URL است. مسیریابی URL جنبه ای در وب است که اصلا در زمان ساخت MVC در نظر گرفته نشده است. بنابراین باید از مدل های خودمان در این جنبه استفاده کرد.

خب چه گزینه هایی برای حل مشکل مسیریابی وجود دارد؟ راه اول این است که هر URLی که وجود دارد را درون حافظه دائمی به همراه اطلاعات مربوط به Model, View و Controller برای لود صفحه ذخیره کنیم. در این صورت سیستم بنا به تقاضای کاربر صفحه مورد نظر را لود میکند. این راه حل واقعا انجام شدنی است البته اگر سایت شما به URLهای داینامیک متکی نباشد و همه URLها به صورت استاتیک تعریف شده باشند. برای مثال کد زیر را در نظر بگیرید:

<?php
$page = $_GET&#91;'page'&#93;;
if (!empty($page)) {

    $data = array(
        'about' => array('model' => 'AboutModel', 'view' => 'AboutView', 'controller' => 'AboutController'),
        'portfolio' => array('model' => 'PortfolioModel', 'view' => 'PortfolioView', 'controller' => 'PortfolioController')
    );

    foreach($data as $key => $components){
        if ($page == $key) {
            $model = $data['model'];
            $view = $data['view'];
            $controller = $data['controller'];
            break;
        }
    }

    if (isset($model)) {
        $m = new $model();
        $c = new $controller($model);
        $v = new $view($model);
        echo $v->output();
    }
}

اگر مانند بالا بخواهیم استفاده کنیم آدرس ما باید به یکی از دو صورت زیر باشد:

example.com/index.php?page=about
example.com/index.php?page=portfolio

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

گزینه دیگری که جلوی روی ماست واگذاری مقداردهی کلاس های Model, View و Controller از طریق URL است. در مثال بالا که استاتیک بود ما با استفاده از آرایه این کلاس ها را برای هر صفحه مقداردهی کردیم  اما با مقداردهی کردن این کلاس ها بوسیله URL آن را به داینامیک تبدیل میکنیم.

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

<?php
$model = $_GET&#91;'model'&#93;;
$view = $_GET&#91;'view'&#93;;
$controller = $_GET&#91;'controller'&#93;;
$action = $_GET&#91;'action'&#93;;

if (!(empty($model) || empty($view) || empty($controller) || empty($action))) {
    $m = new $model();
    $c = new $controller($m, $action);
    $v = new $view($m);
    echo $v->output();
}

با استفاده از کد بالا URL ما به صورت زیر میشود:

example.com/index.php?controller=controllername↦model=modelname&view=viewname&action=actionname

متغیر action در URL به کلاس Controller میگوید که کدام تابع را اجرا کند که در نهایت باعث نمایش آن از طریق کلاس View میشود.

هر دو روش معرفی شده در بالا دارای نکات منفی و مثبت خود است. روش اول دارای پیاده سازی آسان تر است و برای سیستمی مناسب است که بر روی URLهای استاتیک متکی است اما سیستم دوم قابلیت انعطاف زیادی به برنامه میدهد و برای سایت های پویا مناسب است.

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

تمپلیت

احتمالا همه توسعه دهندگان روی این نکته توافق دارند که بدترین کار برای هر برنامه کدهای تکراری برای استفاده مجدد از آن کد است. اصلی به نام DRY یا Don`t Repeat Yourself وجود دارد. این اصل میگوید اگر شما احتیاج دارید که از یک قطعه کد در دو مکان استفاده کنید بهتر است از یک روش جداگانه استفاده کنید و در هر کجا که به آن کد احتیاج دارید فقط آن را صدا بزنید.

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

برای مثال کدهای زیر را در نظر بگیرید:

<?php
class Model
{
    public $tstring;

    public function __construct(){
        $this->tstring = "The string has been loaded through the template.";
        $this->template = "tpl/template.php";
    }
}
<?php
class View
{
    private $model;

    public function __construct($model) {
        $this->controller = $controller;
        $this->model = $model;
    }

    public function output(){
        $data = "<p>" . $this->model->tstring ."</p>";
        require_once($this->model->template);
    }
}
<!DOCTYPE html>
<html>
 <head>
  <meta charset="charset=utf-8">
  <title>The Template name</title>
 </head>
 <body>
  <h1><?php echo $data; ?></h1>
 </body>
</html>

همانطور که در کدهای بالا میبینید ما یک فایل تمپلیت (قسمت آخر) داریم که ثابت است و متن های هر صفحه درون آن قرار میگیرد (در قسمتی که عملیات echo انجام شده است). تمپلیت ها میتواند پیچیده تر یا اختصاصی تر باشند مانند قالب های سیستم مدیریت محتوای وردپرس

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

  • babak می‌گه:

    مفید بود . سپاسگذارم

  • کسری می‌گه:

    سلام
    خسته نباشی
    دمت گرم داداش، سایت خوشکل و مفیدی داری
    موفق باشی

  • مهرآمیز می‌گه:

    سلام. توضیحاتتون بسیار واضح و شفاف بود.ممنون.
    ولی چرا دیگه ادامه نمیدین؟؟ :(

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

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

  • ماندانا می‌گه:

    سلام، خیلی دنبال یه آموزش خوب برای MVC بودم ، ممنونم از مطلب خوبی که گذاشتید ، واقعا سپاسگذارمم


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