ساخت کلاس Routing
شرکت پلاتین ، با مقاله ساخت کلاس 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$ آرایهای چندبُعدی است که در آن یکسری URL پیشفرض تعریف کردهایم به طوری که اگر کاربر هر لینکی به غیر از آنچه در کلیدهای 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 چنین نِیماِسپیسی تعریف نشده است.


