使用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_contains($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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!