이것은 rc router 입니다. 이는 경로에서 자리 표시자를 사용하여 변수를 전달할 수 있는 간단한 정규식 기반 라우터입니다.
나는 두뇌를 유연하게 하고 PHP 공간에서 라우팅이 어떻게 작동하는지 완전히 이해하기 위해 이 작업을 수행했습니다. 단지 그것에 대해 읽고 무엇이 무엇을 했는지 안다고 가정하기보다는, 내 지식을 확고히 하기 위해 이 글을 썼습니다.
간단하게 작곡가를 사용하세요:
composer require robert430404/rc-router
이것은 작곡가 패키지이므로 클래스 자동 로딩을 위해 작곡가에 의존합니다. 그런 다음 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 ' ;
}
변수가 있는 정규식 클로저 기반 경로:
<?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 ' ;
}
변수 및 외부 핸들러가 있는 정규식 경로:
<?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 '
],
];