php实现路由
路由的基本概念
路由(Routing)是指将HTTP请求映射到对应的处理逻辑或控制器方法的过程。在PHP中,可以通过多种方式实现路由功能,常见方法包括手动解析URL、使用框架内置路由或借助第三方库。
手动实现简单路由
通过解析URL路径,匹配预定义的路由规则并调用对应的处理函数或类方法。
// 获取请求路径(去除查询参数)
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = [
'/' => 'HomeController@index',
'/user' => 'UserController@list',
'/user/{id}' => 'UserController@show',
];
// 简单路由匹配
if (array_key_exists($requestUri, $routes)) {
$handler = $routes[$requestUri];
list($controller, $method) = explode('@', $handler);
call_user_func([new $controller(), $method]);
} else {
http_response_code(404);
echo '404 Not Found';
}
使用正则表达式实现动态路由
支持参数化路径(如 /user/123),通过正则匹配提取动态参数。
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = [
'/^\/user\/(\d+)$/' => 'UserController@show',
];
foreach ($routes as $pattern => $handler) {
if (preg_match($pattern, $requestUri, $matches)) {
list($controller, $method) = explode('@', $handler);
$param = $matches[1]; // 提取动态参数
call_user_func([new $controller(), $method], $param);
exit;
}
}
http_response_code(404);
使用第三方路由库
推荐使用成熟的库如 FastRoute,提供高性能的路由解析功能。
require 'vendor/autoload.php';
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/', 'HomeController@index');
$r->addRoute('GET', '/user/{id:\d+}', 'UserController@show');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::FOUND:
list($controller, $method) = explode('@', $routeInfo[1]);
$params = $routeInfo[2];
call_user_func([new $controller(), $method], $params);
break;
case FastRoute\Dispatcher::NOT_FOUND:
http_response_code(404);
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
http_response_code(405);
break;
}
框架集成路由
现代PHP框架(如Laravel、Symfony)内置路由功能,通常通过配置文件或注解定义路由。
Laravel示例(routes/web.php):
Route::get('/', 'HomeController@index');
Route::get('/user/{id}', 'UserController@show');
性能优化建议
- 使用缓存:如FastRoute支持生成缓存文件,避免每次请求解析路由规则。
- 减少正则复杂度:避免过于复杂的正则表达式匹配。
- 采用HTTP方法区分:支持GET、POST等不同请求方法的路由。
通过以上方法,可以实现灵活且高效的PHP路由功能,适用于从简单项目到复杂应用的不同场景。






