ساخت کلاس Routing


در آموزش بررسی ساختار فریمورکی که در این دوره توسعه خواهیم داد، دیدیم که فولدر mvc حاوی فایل و فولدرهای زیر است:

mvc
├── app
├── composer.json
├── public
└── vendor

در فصل دوم به بررسی فولدر public پرداختیم و در این این فصل قصد داریم تا به بررسی فولدر app بپردازیم. برای همین منظور، در مسیر روت پروژه با استفاده از کامند زیر فولدری تحت عنوان app می‌سازیم:

/var/www/mvc$ mkdir app

پیش از این گفتیم که قرار است تا این پوشه حاوی فولدرها و فایل‌های زیر باشد:

Core
├── App.php
├── BaseController.php
├── Interfaces
│   ├── ControllerInterface.php
│   └── UserInterface.php
└── Routing.php

در همین راستا، در این آموزش قصد داریم تا فایل Routing.php را مورد بررسی قرار دهیم. بر اساس استاندارد PSR-4: Autoloader که در آموزش گذشته با مفهوم‌اش آشنا شدیم، ابتدا پوشه‌ای تحت عنوان Core ساخته سپس با استفاده از کامند زیر این فایل را می‌سازیم:

/var/www/mvc/app/Core$ touch Routing.php

ابتدا کدهای زیر را داخل این فایل درج نموده سپس به بررسی آن‌ها خواهیم پرداخت:

<?php
namespace Core;
class Routing
{
    public $routes = [
        [
            'route' => '',
            'module' => 'Base',
            'controller' => 'DefaultController',
            'action' => 'homepage',
        ],
        [
            'route' => 'default/homepage',
            'module' => 'Base',
            'controller' => 'DefaultController',
            'action' => 'homepage',
        ],
        [
            'route' => 'default/about',
            'module' => 'Base',
            'controller' => 'DefaultController',
            'action' => 'about',
        ],
        [
            'route' => 'default/users',
            'module' => 'Base',
            'controller' => 'DefaultController',
            'action' => 'users',
        ]
    ];

    public function __construct()
    {
        return $this->routes;
    }
}

پس از درج تگ آغازین php?> ابتدا کیورد namesapce را نوشته سپس نام پوشه‌ای که داخل آن قرار داریم را می‌نویسیم که در این مثال Core است. در واقع، کاری که نِیم‌اِسپیس انجام می‌دهد این است که مشخص می‌سازد فایل Routing.php دقیقاً در چه مسیری قرار داد و به کدام نِیم‌اِسپیس تعلق دارد؛ سپس در ادامه آموزش فایل composer.json را تکمیل می‌کنیم تا نِیم‌اِسپیسی تحت عنوان Core در این پروژه به رسمیت شناخته شود.

همان‌طور که می‌بینیم، کلاسی تعریف کرده‌ایم به نام Routing که حاوی یک پراپرتی تحت عنوان routes$ از جنس public است که این امکان را برای‌مان فراهم می‌سازد تا از هر جای پروژه به آن دسترسی داشته باشیم. نیاز به توضیح نیست که routes$ آرایه‌ای چندبُعدی است که در آن یکسری یوآرال پیش‌فرض تعریف کرده‌ایم به طوری که اگر کاربر هر لینکی به غیر از آنچه در کلیدهای route در این آرایه تعریف شده را در آدرس‌بار درج نماید، با ارور 404 مواجه خواهد شد. برای مثال، آرایهٔ مربوط به هوم‌پیج سایت را مد نظر قرار می‌دهیم:

[
    'route' => 'default/homepage',
    'module' => 'Base',
    'controller' => 'DefaultController',
    'action' => 'homepage',
]

در آرایهٔ فوق کلیدی داریم تحت عنوان route که مشخصاً لینکی که به هوم‌پیج سایت منتج می‌شود را تعیین می‌کند. سپس کلیدی داریم به نام module که مقدار در نظر گرفته شده برای آن Base است که به منزلهٔ ماژول اصلی این فریمورک می‌باشد که در فصول آتی آن را خواهیم ساخت. کلیدهای controller و action نیز به ترتیب مشخص‌کنندهٔ کنترلر و متدی در ماژول Base هستند که پس از وارد کردن لینک default/homepage فراخوانی خواهند شد.

لازم به یادآوری است کانستراکتور متدی می‌باشد که به محض ساخت یک آبجکت از روی کلاس‌مان فراخوانی خواهد شد. از همین روی، در کانستراکتور کلاس Routing.php دستور داده‌ایم تا به محض ساخت یک آبجکت از روی این کلاس، پراپرتی routes$ ریترن گردد. اکنون به منظور تست، مجدد به فایل index.php بازگشته و آن را به صورت زیر تغییر می‌‌دهیم:

<?php
ini_set('display_errors', '1');
require_once __DIR__ . '/../vendor/autoload.php';

$routingObj = new Core\Routing();
dd($routingObj);

function dd($input)
{
    echo "<pre>";
    var_dump($input);
    echo "</pre>";
    die;
}

با رفتن به مسیر http://mvc.local در مرورگر، در خروجی با ارور زیر مواجه خواهیم شد:

Fatal error: Uncaught Error: Class 'Core\Routing' not found in /var/www/mvc/public/index.php:5 Stack trace: #0 {main} thrown in /var/www/mvc/public/index.php on line 5

این ارور حاکی از آن است که کلاسی با نِیم‌اِسپیس Core\Routing که در خط پنجم فایل index.php استفاده شده است یافت نشد! دلیل این مسئله آن است که در فایل composer.json چنین نِیم‌اِسپیسی تعریف نشده است.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

در این آموزش دیدیم که به چه شکل می‌توان یک کلاس جدید ساخته و آن را با استفاده از کامپوزر به صورت خودکار ایمپورت کرد. همچنین به بررسی این موضوع پرداختیم که بر اساس استاندارد PSR-4: Autoloader به چه شکل می‌توان به روشی بهینه اقدام به ایمپورت کردن کلاس‌ها بر اساس نِیم‌اِسپیس نمود.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان