با مد نظر قرار دادن ساختار پروژهای که قرار است توسعه دهیم، فولدر Core حاوی موارد زیر خواهد بود:
Core
├── App.php
├── BaseController.php
├── Interfaces
│ ├── ControllerInterface.php
│ └── UserInterface.php
└── Routing.phpتا این مرحله از دوره، کلیهٔ فولدرها و فایلهای موجود در Core را ساختهایم به جز App.php که به نوعی این وظیفه را دارا است تا پس از گرفتن ریکوئستها و بر اساس یوآرالی که برایشان تعریف شده است، کنترلر و اَکشن (متد) مرتبط با آنها را اجرا نماید. برای این منظور، در روت فولدر Core فایلی تحت عنوان App.php با محتویات زیر میسازیم:
<?php
namespace Core;
class App
{
private $controller;
private $action;
private $params = [];
private function parseUrl()
{
$request = trim($_SERVER['REQUEST_URI'], '/');
$request = filter_var($request, FILTER_SANITIZE_URL);
$request = explode('/', $request);
return $request;
}
}طبق روال معمول، ابتدا نِیماِسپیس این فایل را مشخص ساخته سپس کلاسی تحت عنوان App داخل آن ایجاد کردهایم که دارای یکسری پراپرتی از جنس private است که قرار است به ترتیب «نام کنترلر»، «نام اَکشن» و «پارامترهای درجشده در یوآرال» را در خود ذخیره سازند.
| نکته |
همچنین میتوانستیم نوع این پراپرتیها را public قرار دهیم اما از آنجا که قصد داریم تا این پراپرتیها صرفاً از داخل همین کلاس در دسترس باشند، تایپ آنها را private در نظر گرفتهایم. |
با توجه به اینکه پس از تکمیل این کلاس پراپرتیهای controller$ و action$ حتماً مقداردهی خواهند شد، مقدار پیشفرضی برای آنها در نظر گرفته نشده اما از آنجا که ممکن است پارامترهای ورودی در یوآرال خالی باشند، برای پراپرتی params$ مقدار پیشفرض [] را در نظر گرفتهایم.
در ادامه، متدی از جنس private تعریف کردهایم به نام ()parseUrl که این وظیفه را دارا است تا بخشهای مختلف یوآرال را در قالب یک آرایه در اختیارمان قرار دهد. همانطور که میبینیم، متغیری ساختهایم تحت عنوان request$ که مقدار اولیهٔ آن برابر با ['SERVER['REQUEST_URI_$ است.
| به خاطر داشته باشید |
| در زبان پیاچپی یکسری متغیر پیشفرض داریم که تحت عنوان Superglobal شناخته میشوند به طوری که فارغ از اِسکوپی که در آن قرار داریم در هر کلاس، متد یا فایلی میتوانیم به آنها دست یابیم که یکی از آنها SERVER_$ است. |
کاری که ['SERVER['REQUEST_URI_$ انجام میدهد آن است که یوآرالی که در آن قرار داریم را ریترن میکند. به طور مثال، اگر در مسیر http://mvc.local/default/about باشیم، مقدار default/about را در اختیارمان میگذارد.
مقدار اولیهٔ متغیر request$ را بدین شکل تعریف کردهایم که خروجی ['SERVER['REQUEST_URI_$ را به عنوان پارامتر اول به متد به اصطلاح Built-in زبان پیاچپی تحت عنوان ()trim دادهایم سپس مقدار '/' را به عنوان پارامتر دوم این متد در نظر گرفتهایم که در نهایت منجر بدین خواهد شد تا هرگونه علامت / از ابتدای یوآرال حذف گردد.
در زبان پیاچپی تابعی داریم تحت عنوان ()filter_var که یک پارامتر ورودی میگیرد و بر اساس فیلترهایی که در قالب کانستنت برایش در نظر میگیریم، میتوانیم دادهٔ ورودی را از یکسری فیلتر عبور داده و هر گونه محتوای مشکوک را از آن حذف نماییم. به طور مثال، در اسکریپت فوق از فیلتر FILTER_SANITIZE_URL استفاده کردهایم که این امکان را در اختیارمان قرار میدهد تا هر گونه کاراکتری به جز اعداد و حروف انگلیسی به علاوهٔ یکسری علائم خاص را حذف کنیم.
در ادامه، با استفاده از متد ()explode گفتهایم که استرینگ ورودی تبدیل به یک آرایه شده و در همان متغیر request$ ذخیره گردد و معیار تفکیک استرینگ ورودیمان نیز علامت / است و در نهایت مقدار این متغیر را ریترن کردهایم. به طور مثال، مسیر http://mvc.local/default/about به آرایهٔ زیر مبدل خواهد شد:
array(2) {
[0]=>
string(7) "default"
[1]=>
string(5) "about"
}در حقیقت، با توجه به اینکه مقداری که ['SERVER['REQUEST_URI_$ بازمیگرداند default/about است و دستور دادهایم که بر اساس علامت / اجزای این استرینگ به آرایه تبدیل گردند، در نهایت خروجی این تابع آرایهای حاوی دو مقدار است که کلید ۰ آن حاوی استرینگ default و کلید ۱ آن حاوی استرینگ about است.
در ادامهٔ تکمیل این کلاس نیاز است تا یک کانستراکتور تعریف کنیم که این وظیفه را خواهد داشت تا به محض فراخوانی این کلاس اجرا گردد اما با توجه به اینکه کانستراکتور مذکور ارتباط تنگاتنگی با ماژول پیشفرض این فریمورک تحت عنوان Base دارد، در فصل آتی ابتدا به توسعهٔ بخشهای ضروری این ماژول پرداخته سپس مجدد به این کلاس بازگشته و آن را تکمیل مینماییم.
