FindSlim 路由系统设计文档

## 1. 路由系统概述
### 1.1 设计目标
- 支持零配置部署(不依赖特定的服务器配置)
- 自动路由注册(基于目录结构)
- 灵活的自定义路由
- 优雅的静态资源处理
- 支持 RESTful API
### 1.2 核心特性
- 基于约定的自动路由
- 自定义路由优先级高于自动路由
- 支持路由参数和正则匹配
- 支持路由中间件
- 静态资源智能分发
## 2. 路由系统架构
### 2.1 目录结构
```
project/
├── app/
│ ├── Core/
│ │ ├── AutoRouter.php # 自动路由加载器
│ │ ├── RouteRegistry.php # 路由注册器
│ │ └── TemplateLoader.php # 模板加载器
│ └── Controllers/ # 控制器目录
├── config/
│ ├── routes.php # 自定义路由配置
│ └── templates.php # 模板配置
├── public/
│ └── index.php # 入口文件
└── templates/ # 模板目录
├── home/
├── blog/
└── user/
```
### 2.2 路由类型
1. **自动路由**:基于目录结构自动生成
2. **自定义路由**:通过配置文件手动定义
3. **静态资源路由**:处理CSS、JS等静态文件
4. **API路由**:处理API请求
## 3. 路由规则
### 3.1 自动路由规则
```php
// 目录结构到路由的映射规则
templates/blog/list.php -> /blog/list
templates/user/profile.php -> /user/profile
templates/home/index.php -> /home 或 /home/index
// 控制器自动匹配
templates/blog/list.php -> BlogController@list
templates/user/profile.php -> UserController@profile
```
### 3.2 自定义路由配置
```php
// config/routes.php
return [
'web' => [
// 基础路由
'/' => ['HomeController', 'index'],
// 带参数的路由
'/blog/{id}' => ['BlogController', 'show'],
// 可选参数
'/user/{name?}' => ['UserController', 'profile'],
// 正则约束
'/post/{id:[0-9]+}' => ['PostController', 'show'],
],
'api' => [
'/api/users' => ['Api\\UserController', 'index'],
],
'static' => [
'/assets/*' => 'static'
]
];
```
### 3.3 静态资源处理
```php
// 静态资源路由配置
'static' => [
// 支持多种静态资源类型
'/assets/css/*' => ['type' => 'static', 'dir' => 'css'],
'/assets/js/*' => ['type' => 'static', 'dir' => 'js'],
'/assets/images/*' => ['type' => 'static', 'dir' => 'images'],
]
```
## 4. 实现示例
### 4.1 自动路由加载器
```php
class AutoRouter {
private $templatePath;
private $controllerNamespace;
publicfunction autoLoadRoutes() {
$templates = $this->scanTemplateDirectory();
foreach ($templates as $template) {
$route = $this->convertTemplateToRoute($template);
$controller = $this->matchController($route);
$this->registerRoute($route, $controller);
}
}
privatefunction scanTemplateDirectory() {
// 扫描模板目录
// 返回所有模板文件的路径
}
privatefunction convertTemplateToRoute($template) {
// 将模板路径转换为路由
// 例:templates/blog/list.php -> /blog/list
}
privatefunction matchController($route) {
// 根据路由匹配控制器
// 返回控制器类名和方法
}
}
```
### 4.2 路由注册器
```php
class RouteRegistry {
private $routes = [];
publicfunction register($method, $pattern, $handler) {
$this->routes[] = [
'method' => $method,
'pattern' => $pattern,
'handler' => $handler
];
}
publicfunction match($method, $uri) {
foreach ($this->routes as $route) {
if ($this->matchRoute($route, $method, $uri)) {
return $route['handler'];
}
}
returnnull;
}
}
```
## 5. 使用示例
### 5.1 注册路由
```php
// 自定义路由
$router->get('/', 'HomeController@index');
$router->get('/blog/{id}', 'BlogController@show');
// 自动注册模板路由
$autoRouter->registerTemplateDirectory(__DIR__ . '/templates');
// 注册静态资源
$router->static('/assets', __DIR__ . '/public/assets');
```
### 5.2 控制器示例
```php
class BlogController {
publicfunction show($id) {
// 处理博客显示逻辑
return$this->view->render('blog/show', ['id' => $id]);
}
}
```
## 6. 注意事项
### 6.1 安全性
- 防止直接访问模板文件
- 验证路由参数
- 防止目录遍历
- 静态资源访问限制
### 6.2 性能优化
- 路由缓存
- 静态资源缓存
- 按需加载控制器
- 减少文件系统操作
### 6.3 开发建议
1. 优先使用自动路由,保持目录结构清晰
2. 特殊情况下使用自定义路由
3. 合理使用路由参数和中间件
4. 保持控制器的单一职责
### 6.4 部署注意事项
1. 确保入口文件(index.php)正确配置
2. 设置适当的文件权限
3. 配置错误处理和日志
4. 优化静态资源访问
## 7. 常见问题解决
### 7.1 路由不匹配
- 检查URL格式是否正确
- 确认路由注册顺序
- 验证参数约束
### 7.2 静态资源访问
- 确认文件权限
- 检查MIME类型配置
- 验证缓存设置
### 7.3 性能问题
- 启用路由缓存
- 优化文件系统操作
- 使用适当的缓存策略
## 8. 后续优化方向
1. 支持路由组
2. 添加路由缓存
3. 优化静态资源处理
4. 增加更多的路由约束类型
5. 支持路由版本控制
6. 添加路由测试工具
## 9. 参考资料
1. PSR-7 HTTP消息接口
2. PSR-15 HTTP服务器请求处理器
3. FastRoute 文档
4. Slim Framework 路由文档

Jeffer.Z.Gustav

This is my note-taking platform. Welcome to visit. I will put some recorded notes here in daily life. You can see some fragments of my thinking and notes.