使用Composer从零开发一个简单的restful框架(06)-路由参数
路由参数
编辑core/Router.php
,修改dispatch
方法
private function dispatch(Route $route, string $method, string $uri, Request $request, Response $response): void {
$group = $route->getGroup();
// 分组不会有命名参数, 不包含直接返回
if (!str_starts_with($uri, $group)) return;
$uri = substr($uri, strlen($group));
slash_add_head($uri);
$routes = $route->getRoutes();
foreach ($routes as $item) {
if ($item instanceof RouteItem) {
if ($method == $item->method && $uri == $item->uri) {
// 全匹配路由
($item->cb)($request, $response);
return;
} else if ($method == $item->method && preg_match_all('(:\w+)', $item->uri, $names)) {
// 参数路由
$pattern = preg_replace('(:\w+)', '(\w+)', $item->uri);
if (preg_match('#^' . $pattern . '$#', $uri, $matches)) {
$params = $this->mergeParams($names[0], $matches);
$request->setParams($params);
($item->cb)($request, $response);
return;
}
}
} else {
$this->dispatch($item, $method, $uri, $request, $response);
}
}
}
private function mergeParams(array $names, array $matches): array {
$params = [];
for ($i = 0; $i < count($names); $i++) {
$key = $names[$i];
$val = $matches[$i + 1];
$params[substr($key, 1)] = $val;
}
return $params;
}
编辑route/test.php
文件,添加一条路由如下
$router->get('/name/:name/age/:age', function(Request $request, Response $response) {
$response->json($request->getParams());
});
测试
浏览器访问 http://phpapi.com/name/php/age/18,输出
{"name":"php","age":"18"}
本作品采用《CC 协议》,转载必须注明作者和本文链接