MVC در PHP قسمت دوم :: Router

شهریور ۱۴, ۱۳۹۲ توسط : سعید

سلام

در پست قبلی درمورد معماری MVC و مزایای اون باهم صحبت کردیم.در این پست و چند پست آینده سعی میکنیم باهم یک فریم ورک سه لایه با معماری MVC بسازیم.برای اینکه بتونید با این آموزشها پیش برید باید با مباحث شیء گرایی در PHP آَشنایی داشته باشید.

شروع کار

یکی از مهمترین قسمتهای پیاده سازی MVC در وب مسیریابی یا Routing میباشد.این یعنی اینکه با استفاده از درخواستی که کاربر داره بتونیم کنترلر ، مدل و ویو مورد نظر رو لود و اجرا کنیم.

درخواست کاربر به وسیله URL ارسال میشه.به عنوان مثال اگر کاربر روی لینک زیر کلیک کنه :

www.domail.com/article/view/2-mvc-in-php

در این معماری باید به این شکل باهاش بخورد کنیم :

article نام کنترلر

view نام اکشن یا متدی که در کنترلر article قرار داره

و قسمت بعدی پارامترهایی که به متد view ارسال میشه رو مشخص میکنه.

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

ما برای فریم ورکمون از مسیریابی اتوماتیک! استفاده میکنیم. برای پیاده سازی مسیریابی باید در فایل htaccess یه سری خطوط رو اضافه کنیم :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
 </IfModule>

در کد بالا همه درخواستها به فایل index.php ارسال میشن و پارامترهای ارسالی به این فایل در متغیر url ذخیره میشن.

( برای اطلاعات بیشتر میتونید این مقاله رو بخونید )

یک فایل با نام index.php بسازید و کدهای زیر رو داخلش بنویسید :

<?php

define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__));

error_reporting(E_ALL - E_NOTICE);

$url = $_GET['url'];

require_once (ROOT . DS . 'library' . DS . 'Router.php');

Router::route($url);

یک ثابت برای نگهداری ” جداکننده پوشه ها ” به این خاطر که در لینوکس و ویندوز این کاراکتر فرق داره. در لینوکس از اسلش ( / ) و در ویندوز از بک اسلش ( \ ) استفاده میشه.

ثابت ROOT برای نگهداری مسیر اصلی فریم ورک

یک فایل در پوشه library با نام Router.php بسازید و محتویات زیر رو داخلش قرار بدید :

<?php

class Router {
    static function route($url){

        $urlparts = @explode('/',$url); 

        $controller = ($urlparts[0] == '' ) ? 'index' : $urlparts[0];
        array_shift($urlparts);
        $action = ($urlparts[0] == '' ) ? 'index' : $urlparts[0];
        array_shift($urlparts);
        $param = $urlparts;

        if(file_exists($cFile = ROOT.'/app/controller/'.$controller.'.php')){
           include  $cFile;
        }else{
            die ('Controller ' . $controller .' Not found');
        }
        $controller = ucwords($controller).'Controller';
        $controllerObj = new $controller();

        if(method_exists($controllerObj, $action)){
            call_user_func_array(array($controllerObj,$action), $param);
        }else{
            die("Action $action not found in $controller Class");
        }

    }
}

این کلاس برای مسیر یابی به کار میره.یک متد با نام route که یک پارامتر میگیره.پارامتر ارسالی همون url ی هست که کاربر درخواست کرده.

ابتدا url رو به وسیله تابع explode به آرایه تبدیل میکنیم.

قسمت اولش میشه نام کنترلرمون . قسمت دومش میشه نام تابع یا متدی که کاربر درخواست کرده. اگر هرکدوم وجود نداشته باشن به صورت پیش فرض کنترلر Index و متد Index اجرا میشه.

بقیه قسمتها هم به عنوان پارامتر در نظر گرفته میشن.

بعدش کلاس کنترلر مورد نظر رو از پوشه app/controller/ لود میکنیم . ازش یک شی میسازیم و با تابع call_user_func_array متد مورد نظر رو با پارامترهایی که داریم اجرا میکنیم.

دقت کنید که نام کلاس کنترلر باید به این صورت باشه :

IndexController

و نام فایلش باید اینجوری باشه :

index.php

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

یک فایل با نام article.php ایجاد کنید و محتویات زیر رو داخلش بنویسید :

<?php

class ArticleController{

    function index(){
        echo 'IndexController -> index action';
    }

    function view($id){
        echo "ID =  $id";
    }
}

حالا آدرس زیر رو باز کنید :

۱۲۷٫۰٫۰٫۱/article/view/32

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

موفق باشید

بازدید : ۱۳۷۴۸

شهریور ۱۵, ۱۳۹۲ @ ۹:۵۴ ق.ظ

عالی بود ممون…..

پاسخ دادن
شهریور ۱۵, ۱۳۹۲ @ ۹:۵۹ ق.ظ

سلام دوست عزیز
مطلب بسیار خوبی بود واقعا مفید بود

پاسخ دادن
    اميد اقاخاني
    خرداد ۲۸, ۱۳۹۵ @ ۱۲:۲۷ ق.ظ

    خواهش میکنم دوست من 🙂

    پاسخ دادن
شهریور ۱۶, ۱۳۹۲ @ ۸:۵۴ ق.ظ

خیلی خوب بود ….

پاسخ دادن
    سعید
    شهریور ۱۶, ۱۳۹۲ @ ۱:۳۵ ب.ظ

    خواهش میکنم حامد جان

    پاسخ دادن
شهریور ۲۱, ۱۳۹۲ @ ۱۱:۵۵ ب.ظ

ممنون. ما که چیزی نفهمیدیم.

پاسخ دادن
آبان ۱۰, ۱۳۹۲ @ ۱۱:۴۰ ق.ظ

ممنون خیلی خوب توضیح میدین.

پاسخ دادن
آبان ۲۰, ۱۳۹۲ @ ۱۰:۵۴ ق.ظ
آبان ۳۰, ۱۳۹۲ @ ۴:۲۵ ب.ظ

بسیار عالی
خیلی خوب توضیح دادید
لطفا همینطور ادامه بدید

پاسخ دادن
دی ۹, ۱۳۹۲ @ ۱:۲۷ ب.ظ

سلام. ممنون.
فقط این اصطلاح را درست کنید:
app/contoller/
باید به
app/controller/
تبدیل شود.
شاید بعضی از افراد مثل من به مشکل برخورد کنند.
بازم ممنون.

پاسخ دادن
    سعید
    دی ۹, ۱۳۹۲ @ ۹:۱۵ ب.ظ

    ممنون از تذکرتون
    اصلاح شد

    پاسخ دادن
دی ۲۲, ۱۳۹۲ @ ۱:۳۱ ب.ظ

سلام من یه جاشو سر در نیاوردم اونم اینکه این فایل article.php رو پیدا نمیکنه. یعنی بهم پیغام
Controller article Not found
رو میده 😐 چیکار کنم پوشه app تو شاخه اصلی هستش و درونش یه پوشه کنترلر و درونش همون فایل آرتیچل هستش . ممنون میشم جوابو همینجا بگید و منم خبر کنید با ایمیلم تا ببینم. تشکر

پاسخ دادن
    سعید
    دی ۲۲, ۱۳۹۲ @ ۳:۴۴ ب.ظ

    سلام
    اگر همه مراحل رو درست انجام داده باشید نباید پیغام بده.
    بازم اگر میتونید پروژه رو آپلود کنید تا ببینم مشکلش کجاست

    پاسخ دادن
      دی ۲۲, ۱۳۹۲ @ ۴:۰۰ ب.ظ

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

      پاسخ دادن
دی ۲۴, ۱۳۹۲ @ ۹:۰۷ ب.ظ

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

پاسخ دادن
اسفند ۷, ۱۳۹۲ @ ۲:۴۷ ب.ظ

سلام
شما در سایتتون برای نمایش کدهای به صورت رنگی از چه کامپونتی استفاده کردید؟ مرسی.

پاسخ دادن
پیمان
خرداد ۱۱, ۱۳۹۳ @ ۱۱:۵۲ ب.ظ

سلام مرسی از مطالب خوبتون

یه سوال : مگه نباید داخل کنترلر قسمت منطقی برنامه اجرا بشه پس چرا از echo استفاده شده ؟
اینجور یکمی با ویو قاطی نمی شه؟ 🙂

پاسخ دادن
نیما
تیر ۱۶, ۱۳۹۳ @ ۴:۲۳ ب.ظ

سلام به همگی .

خیلی ممنون برای توضیحات قشنگتون .. واقعا استفاده بردیم.. ولی استفاده از این شیفت ها برای آنالیز url خیلی ابتدایه. تازه اشم برای خود من اگر فقط کنترلر رو وارد کنی و قسمت های دیگه رو به url ارسال نکنی به دلیل شیف های اضافی (چون دو شیفت اضافی می خوره در حالی که آریه خودش ۱ خونه داره) پیغام خطای undefined offset رو می ده..

روش به درد بخورتری سراغ نداره کسی!! با تشکر

پاسخ دادن
علی
آذر ۳, ۱۳۹۳ @ ۴:۳۷ ب.ظ

سلام
ممنون واقعا آموزش مفیدی بود.
به نظرم شما باید قبل استفاده از فایل .htaccess یه تذکری در مورد اطمینان از لود ماژول mod_rewrite آپاچی میدادید. من با مشکل کار نکردن url مواجه شدم و بعد از کلی سرچ گوگل فهمیدم باید این ماژول رو لود کنم.
به طور پیشفرض این ماژول توی wampserver غیر فعال هست. میشه از طریق منوی wamserver > apache >apache module این ماژول رو فعال کرد.
با تشکر فراوان

پاسخ دادن
    Saeed Moqadam
    آذر ۲۴, ۱۳۹۳ @ ۹:۱۷ ب.ظ

    سلام
    بله کاملا حق باشماست.
    ممنون به خاطر یادآوری

    پاسخ دادن
آذر ۲۴, ۱۳۹۳ @ ۱۱:۵۵ ق.ظ

من چطور میونم در php به صورت کد یه فایل روت بسازم

اگر کمکم کنید منون میشم

پاسخ دادن
    Saeed Moqadam
    آذر ۲۴, ۱۳۹۳ @ ۹:۰۶ ب.ظ

    منظورتون از فایل روت چیه ؟ بیشتر توضیح بدید

    پاسخ دادن
آذر ۲۵, ۱۳۹۳ @ ۱۱:۰۴ ب.ظ

سلام من یه سایت طراحی کردم ولی بلد نیستم بهش مسیر بدم منظورم اینه چطور واسش مسیر تعریف کنم

پاسخ دادن
leila
بهمن ۱۳, ۱۳۹۳ @ ۱۱:۰۹ ق.ظ

سلام.
من دارم یه فروشگاه با mvc php میسازم.
می خوام از ajax استفده کنم ولی روند کارو نمی دونم .
اگه نمونه کد دارید یا سایتی رو میشناسید لطفا راهنمایی کنید

پاسخ دادن
علی
بهمن ۱۳, ۱۳۹۳ @ ۱۲:۳۸ ب.ظ

با سلام … من تمام مراخلو رفتم با این خطا روبرو میشم :
Controller index Not found
علتش چیه؟؟

پاسخ دادن

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*