هذا هو rc router . هذا جهاز توجيه بسيط يعتمد على regex ويسمح لك بتمرير المتغيرات باستخدام العناصر النائبة في مسارك.
لقد فعلت ذلك لاستعراض ذهني والحصول على فهم كامل لكيفية عمل التوجيه في مساحة PHP. بدلاً من مجرد القراءة عنه وافتراض أنني أعرف ماذا فعلت، كتبت هذا لترسيخ معرفتي.
ببساطة استخدم الملحن:
composer require robert430404/rc-router
هذه حزمة ملحن لذا فهي تعتمد على الملحن للتحميل التلقائي للفئات. يمكنك بعد ذلك إنشاء مثيل جديد لكائن Router() والبدء في تعيين المسارات الخاصة بك إلى المثيل. بمجرد تحديد مساراتك، يمكنك بعد ذلك تمرير جهاز التوجيه () إلى Resolver () وهو يتعامل مع مساراتك.
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' / ' , function () {
echo ' Closure Handler Test ' ;
});
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router );
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
يدعم جهاز التوجيه كلاً من متغيرات عناوين URL الخاصة بالسلسلة والأعداد الصحيحة، ويمررها إليك مرة أخرى في مصفوفة. يمكنك تمديد هذا أبعد بأي طريقة تريدها. جهاز التوجيه مرن للغاية في كيفية استخدامه.
يمكنك إما تمرير عملية إغلاق أو وظيفة معالج مسماة لكل مسار للتحكم في ما يحدث عند مطابقة المسار.
عندما لا يتم العثور على مسار، يتم طرح RouteNotFoundException من وحدة الحل ويسمح لك بالتقاط معالج 404 الخاص بك ثم إنشائه.
يمكنك الآن أيضًا الكتابة في المحلل اللغوي المخصص الخاص بك وتمريرها إلى المحلل لجعل أشياء مثل استدعاء Controller@Action أسهل وأكثر نظافة في التنفيذ.
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
use YourProject Routing CustomParser ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' / ' , function () {
echo ' Closure Handler Test ' ;
});
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router , new CustomParser ());
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
إذا لم تقم بتمرير محلل مخصص، فسيتم تعيينه افتراضيًا على المحلل اللغوي المدمج.
عندما تكون هناك عناصر نائبة في مسارك، يتم إرجاعها إليك كمصفوفة يمكنك الوصول إليها في المعالج الخاص بك.
لديك حق الوصول إلى العناصر النائبة للسلسلة. عندما تحدد مساراتك، فإنك تستخدم {} لتحديد العناصر النائبة للسلسلة مثل هذا:
<?php
$ router -> request ([ ' GET ' ], ' /{placeholder} ' , function ( $ mapped ) {
// Deal with returned data and route response here.
});
لديك أيضًا إمكانية الوصول إلى العناصر النائبة الصحيحة. عندما تحدد مسارك، فإنك تستخدم {:i} لتحديد العناصر النائبة الصحيحة مثل هذا:
<?php
$ router -> request ([ ' GET ' ], ' /{placeholder:i} ' , function ( $ mapped ) {
// Deal with returned data and route response here.
});
طريق بسيط يعتمد على الإغلاق:
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' / ' , function () {
echo ' Closure Handler Test ' ;
});
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router );
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
طريق بسيط مع معالج مسمى:
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' / ' , ' handler ' );
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router );
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
function handler ()
{
echo ' External Handler Test ' ;
}
المسار القائم على إغلاق Regex مع المتغيرات:
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' /{id:i}/{post:i} ' , function ( $ mapped ) {
echo ' <pre> ' ;
var_dump ( $ mapped );
echo ' </pre> ' ;
echo ' Route Found ' ;
});
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router );
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
مسار Regex مع المتغيرات والمعالج الخارجي:
<?php
use RcRouter Router ;
use RcRouter Utilities Resolver ;
use RcRouter Exceptions RouteNotFoundException ;
include ' vendor/autoload.php ' ;
$ router = new Router ();
$ router -> request ([ ' GET ' ], ' /{id:i}/{post:i} ' , ' handler ' );
$ uri = $ _SERVER [ ' REQUEST_URI ' ]; // You do not have to use globals here if you have access to a different source.
$ method = $ _SERVER [ ' REQUEST_METHOD ' ]; // You simply need to pass these (uri and method) as strings to the Resolver.
try {
new Resolver ( $ uri , $ method , $ router );
} catch ( RouteNotFoundException $ e ) {
echo ' 404 not found ' ;
}
function handler ( $ mapped )
{
echo ' <pre> ' ;
var_dump ( $ mapped );
echo ' </pre> ' ;
echo ' Route Found ' ;
}
يُرجع المتغير "$mapped" بنية مثل هذا:
<?php
$ mapped = [
' all ' => [
' id ' => 0 ,
' name ' => ' Robert '
],
' int ' => [
' id ' => 0
],
' string ' => [
' name ' => ' Robert '
],
];