php实现路由
PHP 路由实现方法
在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的方法:
基于原生 PHP 的路由实现
创建一个简单的路由解析器,通过解析 URL 路径来决定执行哪个控制器或函数。
$request = $_SERVER['REQUEST_URI'];
switch ($request) {
case '/':
require 'home.php';
break;
case '/about':
require 'about.php';
break;
default:
http_response_code(404);
require '404.php';
break;
}
使用正则表达式匹配路由
更灵活的路由匹配方式,支持动态参数。
$request = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = [
'/user/(\d+)' => 'user.php?id=$1',
'/post/([a-z]+)' => 'post.php?slug=$1'
];
foreach ($routes as $pattern => $destination) {
if (preg_match('#^'.$pattern.'$#', $request, $matches)) {
$params = array_slice($matches, 1);
$query = preg_replace_callback('/\$(\d+)/', function($m) use ($params) {
return $params[$m[1]-1] ?? '';
}, $destination);
require explode('?', $destination)[0];
exit;
}
}
基于类的路由系统
构建更结构化的路由系统,适合大型应用。
class Router {
private $routes = [];
public function add($route, $handler) {
$this->routes[$route] = $handler;
}
public function dispatch() {
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
foreach ($this->routes as $route => $handler) {
if ($route === $uri) {
return call_user_func($handler);
}
}
http_response_code(404);
echo '404 Not Found';
}
}
$router = new Router();
$router->add('/', function() { echo 'Home Page'; });
$router->add('/about', function() { echo 'About Page'; });
$router->dispatch();
使用现有框架的路由组件
许多 PHP 框架如 Laravel、Symfony 都提供了完善的路由系统。
Laravel 路由示例:
Route::get('/', function () {
return view('welcome');
});
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
Symfony 路由示例:
# config/routes.yaml
index:
path: /
controller: App\Controller\DefaultController::index
实现 RESTful API 路由
为 API 设计专用的路由系统,通常包含 HTTP 方法区分。
$method = $_SERVER['REQUEST_METHOD'];
$request = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($method === 'GET' && $request === '/api/users') {
// 获取用户列表逻辑
} elseif ($method === 'POST' && $request === '/api/users') {
// 创建用户逻辑
}
使用 FastRoute 库
FastRoute 是一个流行的 PHP 路由库,性能优异。
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/users', 'get_all_users_handler');
$r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler');
});
$routeInfo = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
// 404 处理
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
// 405 处理
break;
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
// 调用处理器
break;
}
路由实现注意事项
- 路由匹配应遵循明确的优先级规则
- 考虑 URL 规范化处理(如去除多余斜杠)
- 实现路由缓存机制提升性能
- 处理路由参数的安全过滤
- 支持路由分组和中间件功能
- 提供友好的错误处理机制
以上方法可以根据项目需求选择或组合使用,从简单到复杂满足不同规模应用的路由需求。







