晴天之锤 / router
简单的路由工具
Requires (Dev)
- phpunit/phpunit: ^9.5
README
简单的路由工具
如何使用
这个库将如何处理结果回调的决定权交给你,只关注路由
1. 添加新路由
该库提供了三种方法将新路由添加到路由器中。以下是最推荐的1.2方法。
1.1. 路由创建模式
每种方法的结构几乎相同
-
path - 路由器将匹配的路径字符串。它必须以正斜杠结束才能正确工作。对于包含变量参数的段,包含参数名称的花括号(例如,
'/offer/{id}'
) -
callback - 包含将引用路由的类/对象实例名称的数组(例如,
[IndexController::class, "index"]
)。它也可以是一个匿名函数(例如,fn() => print("Hello from anonymous function!")
) -
(可选) methods - 包含对应于该路由的HTTP方法名称的大写字母数组(例如,
["POST", "OPTION"]
)。默认为["GET", "HEAD"]
-
(可选) params - 以参数名称为键,与它们匹配的正则表达式为值的关联数组。如果你在路径中使用了参数化段,你必须在这里提供该正则表达式(例如,
["id" => "\d+"]
) -
(可选) defaults - 以参数名称为键,默认值作为值的关联数组。你可以为一些参数化段提供它们(例如,
["id" => 1]
)
1.2. 从关联数组加载
创建一个新的Router实例,然后调用该实例的Router::insertConfig
方法,传递一个具有上述参数的数组,例如。
use SunnyFlail\Router\Router; $router = new Router(); $router->insertConfig([ [ "index", "/", fn() => print("Talking to you from '/'!"), ] ]);
1.3. 创建路由对象并插入它们
创建一个路由对象并调用Router::addRoutes
,将对象作为参数提供。你可以在一次调用中插入任意多的路由,只需用逗号分隔即可。例如。
use SunnyFlail\Router\Route; $routeOne = new Route("index", "/", fn() => print("Hello world, from index!")); $routeTwo = new Route( "offer", "/offer/{id}", fn($id) => printf("Hello world, from offer number %s!", $id), ["GET", "HEAD"], ["id" => "\d+"], ["id" => 1] ); $router->addRoutes($routeOne, $routeTwo);
1.4. 手动插入路由数据
你也可以通过调用Router::addRoute
方法手动插入数据。它的语法与创建新路由对象时相同。例如。
$router->addRoute("login", "/login/", [LoginController::class, "login"]);
2. 路由
要开始路由,请调用Router::match
,提供大写HTTP请求方法作为第一个参数,以及请求路径作为第二个参数。例如。
$matchedData = $router->match($_SERVER["REQUEST_METHOD"], $_SERVER["REQUEST_PATH"]);
此方法返回一个SunnyFlail\Router\MatchedData
类的实例,其中包含匹配的路由和从参数化段中刮取的数据。
要获取这些数据,请调用MatchedData::getData
方法。它返回一个以参数名称为键的关联数组,并对应于键的刮取值。如果没有参数化参数,则可能返回空数组
要获取匹配的路由,请调用MatchedData::getRoute
如果没有任何路由匹配,则Router::match
方法可能会抛出SunnyFlail\Router\NotFoundException
3. 对插入的路由进行操作
3.1. 从路由器获取路由对象
要获取路由,请调用Router::getRoute
,并提供要搜索的路由名称作为参数。例如。
$route = $router->getRoute("offer");
3.2. 生成URL
要生成指向选定路由的相对(到域名)URL,请调用Route::generateUrl
方法。你可能需要提供一个关联数组来填充参数。
$url = $route->generateUrl(["id" => 2]);