با مد نظر قرار ساختار پروژهای که قرار است توسعه دهیم، فولدر 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
دارد، در فصل آتی ابتدا به توسعهٔ بخشهای ضروری این ماژول پرداخته سپس مجدد به این کلاس بازگشته و آن را تکمیل مینماییم.