路由是 Web 应用的入口,合理的路由配置不仅影响开发效率,还直接关系到 SEO 效果和用户体验。ThinkPHP 作为国内最流行的 PHP 框架之一,提供了灵活而强大的路由系统。本文将从基础到高级,全面讲解 ThinkPHP 的路由配置技巧。
一、路由基础
1. 默认路由规则
ThinkPHP 默认使用 /模块/控制器/方法 的路由格式:
https://example.com/index/user/list
// 模块:index,控制器:User,方法:list
2. 闭包路由
最简单的路由方式,直接在路由文件中定义:
// route/app.php
use think\facade\Route;
Route::get('hello/:name', function ($name) {
return 'Hello, ' . $name;
});
二、路由定义方式
1. 路由到控制器方法
// GET 请求
Route::get('user/:id', 'User/read');
// POST 请求
Route::post('user', 'User/save');
// 支持多种请求
Route::rule('user/:id', 'User/read')
->allow(['GET', 'POST']);
2. RESTful 路由
Route::resource('blog', 'Blog');
// 自动生成以下路由:
// GET /blog -> Blog/index
// GET /blog/:id -> Blog/read
// POST /blog -> Blog/save
// PUT /blog/:id -> Blog/update
// DELETE /blog/:id -> Blog/delete
3. 分组路由
Route::group('api', function () {
Route::get('user/:id', 'User/read');
Route::post('user', 'User/save');
Route::put('user/:id', 'User/update');
})->prefix('api/')->middleware(ApiAuth::class);
分组路由可以统一设置前缀、中间件、域名等,非常适合 API 模块。
三、路由参数与变量
1. 必选参数
Route::get('article/:id', 'Article/read');
2. 可选参数
Route::get('list/:page?', 'Article/list');
3. 参数约束
// 限制为数字
Route::get('user/:id', 'User/read')
->pattern(['id' => '\d+']);
// 多个参数约束
Route::get('blog/:year/:month', 'Blog/archive')
->pattern([
'year' => '\d{4}',
'month' => '\d{2}'
]);
四、SEO 友好路由
1. URL 别名
Route::get('about-us', 'Page/about')
->name('about_page');
2. URL 生成
// 在模板中生成 URL
$url = url('about_page');
// 带参数
$url = url('User/read', ['id' => 5]);
// 输出:/user/5
3. 去掉 index.php
在 Nginx 配置中添加重写规则:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
五、高级路由技巧
1. 域名路由
// 子域名路由
Route::domain('api', function () {
Route::get('user/:id', 'Api/User/read');
Route::post('user', 'Api/User/save');
});
// 泛域名路由
Route::domain('*user*', function () {
Route::get('/', 'User/home');
});
2. MISS 路由(404 处理)
Route::miss(function () {
return view('404');
});
3. 路由中间件
// 单个路由
Route::get('admin/dashboard', 'Admin/index')
->middleware(AuthCheck::class);
// 分组路由
Route::group('admin', function () {
Route::get('dashboard', 'Admin/index');
Route::get('users', 'Admin/users');
})->middleware([AuthCheck::class, Log::class]);
4. 路由缓存
生产环境开启路由缓存可以显著提升性能:
// 开启路由缓存
Route::setRouteCache(true);
六、常见问题与解决方案
1. 路由不生效
检查以下配置:
// config/route.php
'url_route_on' => true, // 开启路由
'url_route_must' => false, // 非强制路由模式
2. 路由优先级
ThinkPHP 按定义顺序匹配路由,先定义的优先匹配。注意把具体路由放在通配路由前面:
// 正确顺序
Route::get('user/profile', 'User/profile'); // 具体路由
Route::get('user/:id', 'User/read'); // 通配路由
// 错误顺序会导致 profile 被 :id 捕获
3. 路由与控制器命名空间
// 多应用模式下指定应用
Route::get('api/user/:id', 'api/User/read');
七、最佳实践
- API 路由统一前缀:所有 API 使用 /api 前缀,方便做统一鉴权和版本管理
- RESTful 风格:遵循 REST 规范,GET 查询、POST 创建、PUT 更新、DELETE 删除
- 路由版本化:API 升级时使用版本前缀 /api/v1、/api/v2
- 参数验证:始终使用 pattern 约束路由参数类型
- 生产环境缓存:开启路由缓存提升性能
八、总结
ThinkPHP 的路由系统功能强大且灵活,从简单的闭包路由到复杂的分组、域名路由,都能轻松应对。掌握路由配置是高效开发的基础,建议在项目中建立统一的路由规范,让团队协作更顺畅。
关于我们
如果你在PHP 开发、ThinkPHP 框架、网站建设等方面需要帮助,尊云科技可以为你提供服务。
我们专注于网站建设、APP开发、小程序开发、PHP/Vue/UniApp开发、API接口、AI集成,拥有丰富的项目经验。
联系方式:
- 微信:yvsm316
- QQ:316430983
- 官网:https://zunyun.cc/
