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

سپتامبر 5, 2013 توسط : سعید

سلام

در پست قبلی درمورد معماری 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";
    }
}

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

127.0.0.1/article/view/32

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

موفق باشید

سپتامبر 6, 2013 @ 9:54 ق.ظ

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

پاسخ
سپتامبر 6, 2013 @ 9:59 ق.ظ

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

پاسخ
    اميد اقاخاني
    ژوئن 17, 2016 @ 12:27 ق.ظ

    خواهش ميكنم دوست من 🙂

    پاسخ
      سعید
      ژوئن 17, 2016 @ 7:39 ب.ظ

      :))))))

      پاسخ
سپتامبر 7, 2013 @ 8:54 ق.ظ

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

پاسخ
    سعید
    سپتامبر 7, 2013 @ 1:35 ب.ظ

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

    پاسخ
سپتامبر 12, 2013 @ 11:55 ب.ظ

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

پاسخ
نوامبر 1, 2013 @ 11:40 ق.ظ

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

پاسخ
نوامبر 11, 2013 @ 10:54 ق.ظ

tanx

پاسخ
نوامبر 21, 2013 @ 4:25 ب.ظ

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

پاسخ
دسامبر 30, 2013 @ 1:27 ب.ظ

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

پاسخ
    سعید
    دسامبر 30, 2013 @ 9:15 ب.ظ

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

    پاسخ
ژانویه 12, 2014 @ 1:31 ب.ظ

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

پاسخ
    سعید
    ژانویه 12, 2014 @ 3:44 ب.ظ

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

    پاسخ
      ژانویه 12, 2014 @ 4:00 ب.ظ

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

      پاسخ
ژانویه 14, 2014 @ 9:07 ب.ظ

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

پاسخ
فوریه 26, 2014 @ 2:47 ب.ظ

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

پاسخ
پیمان
ژوئن 1, 2014 @ 11:52 ب.ظ

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

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

پاسخ
نیما
جولای 7, 2014 @ 4:23 ب.ظ

سلام به همگی .

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

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

پاسخ
علی
نوامبر 24, 2014 @ 4:37 ب.ظ

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

پاسخ
    Saeed Moqadam
    دسامبر 15, 2014 @ 9:17 ب.ظ

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

    پاسخ
دسامبر 15, 2014 @ 11:55 ق.ظ

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

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

پاسخ
    Saeed Moqadam
    دسامبر 15, 2014 @ 9:06 ب.ظ

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

    پاسخ
دسامبر 16, 2014 @ 11:04 ب.ظ

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

پاسخ
leila
فوریه 2, 2015 @ 11:09 ق.ظ

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

پاسخ
علی
فوریه 2, 2015 @ 12:38 ب.ظ

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

پاسخ
amir
سپتامبر 12, 2017 @ 5:10 ب.ظ

با سلام و تشکر به خاطر این مطلب مفید
وقتی من می خوام به فرم رو ارسال کنم به یه فایل دیگه چه طور به فرستم؟
به این ادرس ری رایت شده یا url ساده؟

پاسخ
    سعید
    نوامبر 2, 2017 @ 11:14 ق.ظ

    به آدرس ری رایت شده باید بفرستید

    پاسخ

دیدگاهتان را بنویسید

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


*