php 路由实现的
PHP 路由实现方法
基于原生 PHP 实现路由
创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。
// 定义路由表
$routes = [
'/' => 'homeController',
'/about' => 'aboutController',
'/contact' => 'contactController'
];
// 获取当前请求路径
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// 检查路由是否存在
if (array_key_exists($path, $routes)) {
$controller = $routes[$path];
// 调用对应的控制器
call_user_func($controller);
} else {
// 处理 404 错误
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
}
使用 .htaccess 重写路由
通过 Apache 的 mod_rewrite 模块将所有请求重定向到单一入口文件(如 index.php)。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
基于正则表达式的动态路由
支持动态参数的路由匹配,例如 /user/123 可以匹配到用户 ID。
$routes = [
'/user/(\d+)' => 'userController'
];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
foreach ($routes as $route => $controller) {
if (preg_match("#^$route$#", $path, $matches)) {
array_shift($matches); // 移除完整匹配项
call_user_func_array($controller, $matches);
exit;
}
}
// 404 处理
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
使用 Composer 依赖包实现路由
通过第三方库(如 nikic/FastRoute)快速实现路由功能。

安装 FastRoute:
composer require nikic/fast-route
示例代码:

require 'vendor/autoload.php';
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/', 'homeController');
$r->addRoute('GET', '/user/{id:\d+}', 'userController');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$routeInfo = $dispatcher->dispatch($httpMethod, $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];
call_user_func_array($handler, $vars);
break;
}
路由分组与中间件
支持路由分组和中间件功能,适用于更复杂的应用场景。
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addGroup('/admin', function (FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/dashboard', 'adminDashboardController');
$r->addRoute('GET', '/users', 'adminUsersController');
});
});
// 中间件示例
function authMiddleware($next) {
if (!isset($_SESSION['user'])) {
header('Location: /login');
exit;
}
return $next();
}
RESTful API 路由
为 API 设计支持不同 HTTP 方法的路由。
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/api/users', 'getUsers');
$r->addRoute('POST', '/api/users', 'createUser');
$r->addRoute('PUT', '/api/users/{id:\d+}', 'updateUser');
$r->addRoute('DELETE', '/api/users/{id:\d+}', 'deleteUser');
});
性能优化建议
对于生产环境,建议缓存路由配置以提高性能。FastRoute 支持生成缓存文件:
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
// 路由定义
}, [
'cacheFile' => __DIR__ . '/route.cache',
'cacheDisabled' => false, // 生产环境设置为 false
]);
以上方法涵盖了从简单到复杂的 PHP 路由实现方案,可根据项目需求选择合适的实现方式。






