ساخت فریمورک PHP MVC در ۴ قدم

ساخت فریمورک PHP MVC در ۴ قدم

بروزرسانی : 5 ماه پیش

این روز ها وب سایت ها پیچیده تر از قبل شده اند ، دیگر ساختن وب سایت در نمایش اطلاعات شرکت و محصولات خلاصه نمیشود بلکه شما باید توانایی پیاده سازی وب سایت های هوشمند و کاربردی را داشته باشید تا کاربران بصورت واقعی بتوانند با سایت شما تعامل برقرار کنند. 

برای مدیریت و نگهداری چنین وب سایت هایی که پیچیدگی بیشتری دارند شما به ابزارهایی نیاز دارید که سرعت توسعه ی سایت را افزایش دهد و همینطور کیفیت را فدای سرعت نکند.

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

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

 

چرا باید یک فریمورک PHP MVC برای خودتان بسازید‌؟

گاهی بعنوان یک برنامه نویس Php ممکن است انتخاب یک فریمورک آماده برای شما سخت باشد ، شاید بخاطر دلایلی مثل زمان یا نداشتن نیاز به یادگیری چیز جدیدی باشد. همچنین برای پروژه های کوچک یا پروژه هایی با هدف صرفا آموزش ، میتوانید یک فریمورک Php شخصی برای خودتان بسازید.

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

آموزش ساخت فریمورک php mvc

اگر در حال یادگیری برنامه نویسی شی گرا (object oriented programming) با زبان پی اچ پی هستید  و دنبال محک زدن و تقویت تخصص های خود هستید ساختن یک فریمورک php mvc به شما کمک زیادی خواهد کرد.

همانطور که میدانید زبان برنامه نویسی پی اچ پی فریمورک های زیاد و محبوبی مثل Laravel ، codeigniter ، symfony و... دارد ولی ساختن یک فریمورک کوچک و ساده برای PHP بصورت mvc یک کار بسیار عالی برای یادگیری php mvc  و درک فریمورک های دیگراست.

 

قدم ۱ - در ابتدا باید تمام ورودی های سایت خود را از طریق index.php کنترل کنید.

در این قدم ما باید یک فایل .htaccess در ریشه ی اصلی سایتمان بسازیم. ریشه ی اصلی یا root همان جایی است که پوشه ی ( دایرکتوری) اصلی سایت ما میباشد. سپس کدهای زیر را درون این فایل بنویسید : 

برای Apache :

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.+)$ index.php/$1 [L]

برای Nginx : 

# nginx configuration

location / {
if (!-e $request_filename){
rewrite ^(.+)$ /index.php/$1 break;
}
}

بعد از اینکه فایل htaccess را با محتویات بالا درست کردید حالا وقت ساختن فایلی به نام index.php در کنار htaccess میباشد. بعد از ساختن index.php کدهای زیر را درون آن بنویسید :

<?php

    if (!isset($_SERVER['PATH_INFO']))
    {
        echo "Home page";
        exit();
    }

    print "The request path is : ".$_SERVER['PATH_INFO'];
?>

بعد از نوشتن کد php که بالا قرار دادیم از طریق مرورگر URL های زیر را تست و نتیجه ی آنها را ببینید : 

  • http://localhost:8000
  • http://localhost:8000
  • http://localhost:8000/something
  • http://localhost:8000/many/otherthings

همانطور که میبینید هرچیزی که شما در URL وارد کنید شما را به index.php ریدایرکت خواهد کرد. اینجاست که شما توانایی تصمیم گیری به درخواست های کاربران در URL از طریق فریمورک php mvc خود را خواهید داشت.

 

قدم ۲ - ساخت فولدرهایی برای نگهداری Model ها ، View ها و controller ها

برای ساختن فریمورک php mvc خود حتما باید اصول الگوی ام وی سی را رعایت بکنید به همین علت باید سه پوشه جدید در روت یا مسیر اصلی پروژه ی خود بسازید و نام آنها را Models , Views  و Controllers قرار دهید.

آموزش ساخت فریمورک php mvc برای وب

تا اینجای کار پوشه ها و فایل های درون پروژه ی ما به این شکل است : 

  • myProject
  • Controllers
  • Models
  • Views
  • .htaccess
  • index.php

 

قدم ۳ - کنترل درخواست ها ( routing ) در فریمورک php mvc

برای کنترل درخواست ها در فریمورک های php هر کسی میتواند براساس سلیقه ی خود سیستمی را پیاده سازی کند اما چون ما فریمورک خود را براساس php mvc طراحی میکنیم پس بهتر است که از اصول MVC استفاده کنیم.

برای اینکار ما باید درک کنیم که کدام درخواست مربوط به controller هست و کدام مربوط به model یا view و ... برای دستیبانی به این سیستم ما باید قوانینی را برای فریمورک php mvc خود طراحی کنیم.

اگر بخواهیم url ها و درخواست های مبنی بر mvc باشد باید قانون ما به این شکل تعریف شود که بعد از نام دامنه ی سایت ، نام کنترلر و بعد از آن نام متد قرار بگیرد و بعد از آن تمام قسمت ها در url بعنوان پارامترهایی برای آن متود در نظر گرفته شود.برای مثال url زیر را در نظر بگیرید : 

http://localhost:8000/controller/action/param1/param2/paramN

برای پیاده سازی این کار در فریمورک php mvc ما ، ابتدا به فایل index.php که قبلتر ساختیم مراجعه کنید و تمام محتوای آن را پاکسازی کنید و کدهای زیر را درون این فایل بنویسید : 

<?php 

$url = isset($_SERVER['PATH_INFO']) ? explode('/', $_SERVER['PATH_INFO']) : '/';

var_dump($url);
?>

فایل index.php را ذخیره سازی کنید و حالا دوباره url های مختلفی که در بالا تست کردیم را مجددا تست کنید.

توجه کنید که اولین عضو Array ما کنترلر ما نیست و این طبیعیه چون که url با / شروع میشود و قبل از آن چیز خاصی نیست.

پس متغیر $url که در کدهای بالا درون index.php نوشتیم را بصورت زیر عوض کنید : 

$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'],'/')) : '/';

حالا اولین عنصر همان نام controller ما هست و ما دو حالت در اینجا داریم مقدار $url یک / هست در این صورت ما در صفحه ی اصلی سایت هستیم و در غیر این صورت یک آرایه داریم که عضو اول آن نام کنترلر و بعدی نام اکشن یا متود درون این کنترلر هست و پارت های بعدی در url همگی پارامتر های ورودی برای این متود هستند.

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

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

بنابراین کدهای index خود را بصورت زیر تغییر دهید : 

<?php

    $url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'],'/')) : '/';

    if ($url == '/')
    {

        // This is the home page
        // Initiate the home controller
        // and render the home view

        require_once __DIR__.'/Models/index_model.php';
        require_once __DIR__.'/Controllers/index_controller.php';
        require_once __DIR__.'/Views/index_view.php';

        $indexModel = New IndexModel();
        $indexController = New IndexController($indexModel);
        $indexView = New IndexView($indexController, $indexModel);

        print $indexView->index();

    }else{

        // This is not home page
        // Initiate the appropriate controller
        // and render the required view

        //The first element should be a controller
        $requestedController = $url[0]; 

        // If a second part is added in the URI, 
        // it should be a method
        $requestedAction = isset($url[1])? $url[1] :'';

        // The remain parts are considered as 
        // arguments of the method
        $requestedParams = array_slice($url, 2); 

        // Check if controller exists. NB: 
        // You have to do that for the model and the view too
        $ctrlPath = __DIR__.'/Controllers/'.$requestedController.'_controller.php';

        if (file_exists($ctrlPath))
        {

            require_once __DIR__.'/Models/'.$requestedController.'_model.php';
            require_once __DIR__.'/Controllers/'.$requestedController.'_controller.php';
            require_once __DIR__.'/Views/'.$requestedController.'_view.php';

            $modelName      = ucfirst($requestedController).'Model';
            $controllerName = ucfirst($requestedController).'Controller';
            $viewName       = ucfirst($requestedController).'View';

            $controllerObj  = new $controllerName( new $modelName );
            $viewObj        = new $viewName( $controllerObj, new $modelName );

            // If there is a method - Second parameter
            if ($requestedAction != '')
            {
                // then we call the method via the view
                // dynamic call of the view
                print $viewObj->$requestedAction($requestedParams);

            }

        }else{

            header('HTTP/1.1 404 Not Found');
            die('404 - The file - '.$ctrlPath.' - not found');
            //require the 404 controller and initiate it
            //Display its view
        }
    }

 

قدم ۴ ساختن صفحات بیشتر در فریمورک php mvc

تا اینجای کار که ما فریمورک php mvc خودمان را توسعه دادیم در صورت اینکه کاربر چنین آدرسی را درخواست کند
http://localhost:8000/about/now
سیستم فریمورک ما به دنبال کنترلری به نام about درون پوشه ی controllers میگردد و سپس از دورن این فایل متودی به نام now را درخواست میکند.

در این قسمت ما قصد داریم که یک صفحه ی view را هم نمایش دهیم و همچنین نحوه ی فراخوانی مدل ها را هم یاد بگیریم.

برای این کار یک فایل جدید در مسیر Controllers/index_controller.php بسازید و کدهای زیر را درونش بنویسید : 

<?php

    /**
    * The home page controller
    */
    class IndexController
    {
        private $model;

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

        public function sayWelcome()
        {
            return $this->model->welcomeMessage();
        }

    }

یک عدد فایل model نیز بسازید که در مسیر Models/index_model.php قرار بگیرد و کدهای زیر را درونش بنویسید :‌

<?php

    /**
    * The home page model
    */
    class IndexModel
    {

        private $message = 'Welcome to Home page.';

        function __construct()
        {

        }

        public function welcomeMessage()
        {
            return $this->message;
        }

    }

همچنین برای ساختن ویو فریمورک php mvc یک فایل جدید در مسیر Views/index_view.php بسازید و کدهای زیر را درونش بنویسید : 

<?php

    /**
    * The home page view
    */
    class IndexView
    {

        private $model;

        private $controller;

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

            $this->model = $model;

            print "Home - ";
        }

        public function index()
        {
            return $this->controller->sayWelcome();
        }

        public function action()
        {
            return $this->controller->takeAction();
        }

    }

توجه فرمایید که در قسمت های بالا وقتی گفته شده Views/index_view.php یعنی یک فایل به نام index_view.php درون پوشه ی Views بسازید و بقیه هم به همین شکل.

حالا در مرورگر خود به آدرس http://localhost:8000/ بروید و تست کنید.شما پیام welcome را خواهید دید.

حالا بیایید یک صفحه ی دیگری به نام about هم اضافه کنیم تا تسلط بیشتری به فریمورک php mvc خودمان داشته باشیم.

فایل جدیدی در مسیر Controllers/about_controller.php بسازید و کدهای زیر را بعنوان کنترلر درون آن بنویسید : 

<?php

    /**
    * The about page controller
    */
    class AboutController
    {
        private $modelObj;

        function __construct( $model )
        {
            $this->modelObj = $model;

        }

        public function current()
        {
            return $this->modelObj->message = "About us today changed by aboutController.";
        }
     }

همچنین برای ساختن مدل یک فایل جدید در مسیر Models/about_model.php بسازید و کدهای زیر را درون آن بنویسید :‌

<?php

    /**
    * The about page model
    */
    class AboutModel
    {

        private $message;

        public function __construct()
        {
            $this->message = "Welcome to the of PHP MVC framework official site.";
        }

        public function nowADays()
        {
            return $this->message = "nowadays everybody wants to be a boss.";
        }
    }

حالا برای نمایش view لازم که یک فایل جدید در مسیر Views/about_view.php بسازید و کدهای زیر را درون آن بنویسید :‌

<?php

    /**
    * The about page view
    */
    class AboutView
    {

        private $modelObj;

        private $controller;

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

            $this->modelObj = $model;

            print "About - ";
        }

        public function now()
        {
            return $this->modelObj->nowADays();
        }

        public function today()
        {
            return $this->controller->current();
        }

    }

حالا از طریق مرورگر به آدرس http://localhost:8000/about بروید و میبینید که فریمورک php mvc ما به درستی کار میکند و صفحه ی about برای شما نمایش داده میشود.

وقتی که به ادرس http://localhost:8000/about/now بروید با پیامی متفاوت روبرو میشوید.

 

نتیجه گیری و سخن پایانی

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

شما میتوانید از composer کمک بگیرید یا از کامپوننت های دیگر فریمورک ها کمک بگیرید تا فریمورک خود را کامل کنید ( کاری که لاراول برای ساخته شدن انجام داده است ).

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

شما میتوانید از Codeigniter بعنوان یک فریمورک کوچک و سبک یا از Laravel بعنوان یک فریمورک که مرتبا بروزرسانی میشود و پکیج های زیادی دارد برای توسعه ی وب خود استفاده کنید ولی اگر میخواهید آنها را خوب درک کنید ابتدا با این آموزش یک فریمورک کوچک بسازید.

 

لینک کوتاه این مقاله : https://avasam.ir/post/383
این سیستم برپایه ی علاقه مندی شما یک دوره ی مناسب به شما پیشنهاد میدهد
مرا بسوی بهترین دوره ی آموزشی که برای من مناسب است هدایت کن 🤖
برای استفاده ی دیگران و حمایت از ما در جامعه های زیر به اشتراک بگذارید

.:: نظرهای کاربران ::.
حمید / 2 سال پیش

استاد به نظرتون میشه یه فریمورک قوی php mvc خودمون بسازیم اختصاصی باشه یا بریم سراغ لاراول و .. ؟ 

مصطفی / 2 سال پیش

آموزش بسیار عالی برای ساخت فریمورک php بود خیلی ساده و روان خیلی خیلی ممنونم از سایت خوب آواسام

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