在开发 Web 应用时,路由系统的作用是将用户请求的 URL 解析为相应的控制器与方法。虽然现代框架(如 Laravel、Symfony)都内置了强大的路由系统,但在轻量项目或学习阶段,我们也可以用 PHP 自带的 parse_url 函数实现一个简易的路由分发机制。
本文将介绍如何使用 parse_url 和部分字符串处理函数来搭建一个简单的 URL 路由解析系统。
parse_url 是 PHP 内置的函数,用于将 URL 拆解成各个组成部分,如 scheme、host、path、query 等。示例如下:
$url = 'https://gitbox.net/user/profile?id=42';
$parts = parse_url($url);
print_r($parts);
输出:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /user/profile
[query] => id=42
)
从输出可以看出,parse_url 能帮助我们准确地获取 URL 的 path 和 query,这正是我们实现路由解析所需的关键部分。
我们来构建一个支持类似以下 URL 的简易路由系统:
https://gitbox.net/controller/action/param1/param2
我们希望根据 controller 和 action 的名称来调用对应的方法,并把后续的参数传入。
假设我们的 PHP 应用部署在支持 URL 重写的服务器上,我们可以通过 $_SERVER['REQUEST_URI'] 获取当前请求路径:
$requestUri = $_SERVER['REQUEST_URI'];
$path = parse_url($requestUri, PHP_URL_PATH);
// 移除开头和结尾的斜杠,并按斜杠分割
$segments = explode('/', trim($path, '/'));
$controller = !empty($segments[0]) ? ucfirst($segments[0]) . 'Controller' : 'HomeController';
$action = isset($segments[1]) ? $segments[1] : 'index';
$params = array_slice($segments, 2);
class UserController {
public function profile($id = null) {
echo "User profile page. ID: " . htmlspecialchars($id);
}
}
if (class_exists($controller)) {
$instance = new $controller();
if (method_exists($instance, $action)) {
call_user_func_array([$instance, $action], $params);
} else {
http_response_code(404);
echo "方法不存在:$action";
}
} else {
http_response_code(404);
echo "控制器不存在:$controller";
}
假设我们访问以下地址:
https://gitbox.net/user/profile/42
解析后的变量将是:
$controller = 'UserController';
$action = 'profile';
$params = ['42'];
输出:
User profile page. ID: 42
通过 parse_url 函数结合 explode 和 call_user_func_array,我们可以用非常简单的代码快速搭建一个轻量级的路由分发机制。尽管它无法满足复杂应用的需求,但对于学习和构建简单 API 接口来说,已经足够实用。在后续开发中,可以进一步加入正则匹配、默认参数、错误处理和命名空间支持,使系统更完善。