php处理restful请求的路由类分享


当然,我可以为你提供一个基本的PHP类示例,用于处理RESTful请求的路由。请注意,这个示例是基于简单的URL解析和分发逻辑,没有使用任何框架或中间件。


<?php

class Router
{
    protected $routes = [];

    public function addRoute($method, $pattern, $handler)
    {
        $this->routes[$method][$pattern] = $handler;
    }

    public function dispatch()
    {
        $method = $_SERVER['REQUEST_METHOD'];
        $uri = $_SERVER['REQUEST_URI'];

        // 移除查询字符串
        if (($pos = strpos($uri, '?')) !== false) {
            $uri = substr($uri, 0, $pos);
        }

        // 尝试匹配路由
        if (isset($this->routes[$method])) {
            foreach ($this->routes[$method] as $pattern => $handler) {
                if (preg_match('#^' . str_replace('/', '\/', $pattern) . '$#', $uri)) {
                    // 调用处理器
                    call_user_func($handler);
                    return;
                }
            }
        }

        // 如果没有找到匹配的路由,返回404
        http_response_code(404);
        echo 'Not Found';
    }
}

// 使用示例
$router = new Router();
$router->addRoute('GET', '/', function() {
    echo 'Home Page';
});

$router->addRoute('GET', '/about', function() {
    echo 'About Page';
});

// 分发请求
$router->dispatch();

这个`Router`类允许你添加路由规则,并通过`dispatch`方法根据HTTP请求方法和URI分发请求到对应的处理器(在这个例子中是匿名函数)。路由匹配是通过正则表达式实现的,但在这个简单的例子中,我们直接使用了完整的URI路径作为模式字符串,并通过`preg_match`进行匹配。

请注意,这个示例非常基础,并且没有处理URL参数或复杂的路由逻辑。在实际应用中,你可能会需要使用更成熟的路由库或框架来处理RESTful请求。