php 实现路由
路由的基本概念
路由是将URL映射到特定处理逻辑的过程,用于解析请求并分发给对应的控制器或函数。PHP中可通过多种方式实现路由功能,常见方法包括基础实现、框架集成和高级路由库。
基础实现:手动解析URL
通过解析$_SERVER['REQUEST_URI']实现简单路由:
$request = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = [
'/' => 'homeController',
'/about' => 'aboutController'
];
if (array_key_exists($request, $routes)) {
call_user_func($routes[$request]);
} else {
header("HTTP/1.0 404 Not Found");
}
使用正则表达式匹配动态路由
支持参数化路径(如/user/123):
$uri = $_SERVER['REQUEST_URI'];
preg_match('#^/user/(\d+)$#', $uri, $matches);
if (!empty($matches)) {
$userId = $matches[1];
showUser($userId); // 调用处理函数
}
基于框架的路由实现(Laravel示例)
现代PHP框架通常内置路由系统。Laravel中的路由定义:
Route::get('/posts', 'PostController@index');
Route::post('/posts', 'PostController@store');
Route::get('/posts/{id}', 'PostController@show');
使用独立路由组件
安装AltoRouter等专用库:
require_once 'vendor/autoload.php';
$router = new AltoRouter();
$router->map('GET', '/users', 'UserController#index');
$match = $router->match();
if ($match) {
call_user_func($match['target']);
}
RESTful API路由设计
遵循HTTP动词的语义化路由:
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
switch ($method) {
case 'GET':
if ($path === '/api/products') {
getProducts();
}
break;
case 'POST':
if ($path === '/api/products') {
addProduct();
}
break;
}
路由缓存优化
对路由规则进行编译缓存提升性能(以Symfony为例):
$router = new Symfony\Component\Routing\Router(
new Symfony\Component\Routing\RouteCollection(),
new Symfony\Component\Routing\RequestContext()
);
$cachedRouter = new Symfony\Component\Routing\Matcher\CompiledUrlMatcher(
$router->getRouteCollection()->compile(),
new Symfony\Component\Routing\RequestContext()
);
中间件集成
在路由处理前后插入中间件逻辑:
$app->add(function ($request, $handler) {
// 前置中间件逻辑
$response = $handler->handle($request);
// 后置中间件逻辑
return $response;
});
注意事项
- 需处理URL编码和特殊字符
- 考虑路由冲突的优先级规则
- 生产环境建议使用成熟的框架路由系统
- 对动态参数进行严格的类型校验和安全过滤







