ساخت کلاس 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 به چه شکل میتوان به روشی بهینه اقدام به ایمپورت کردن کلاسها بر اساس نِیماِسپیس نمود.