ThinkPHP路由配置全解析:从基础到高级的完整指南

2026-05-24 码匠 PHP

路由是 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');

七、最佳实践

  1. API 路由统一前缀:所有 API 使用 /api 前缀,方便做统一鉴权和版本管理
  2. RESTful 风格:遵循 REST 规范,GET 查询、POST 创建、PUT 更新、DELETE 删除
  3. 路由版本化:API 升级时使用版本前缀 /api/v1、/api/v2
  4. 参数验证:始终使用 pattern 约束路由参数类型
  5. 生产环境缓存:开启路由缓存提升性能

八、总结

ThinkPHP 的路由系统功能强大且灵活,从简单的闭包路由到复杂的分组、域名路由,都能轻松应对。掌握路由配置是高效开发的基础,建议在项目中建立统一的路由规范,让团队协作更顺畅。


关于我们

如果你在PHP 开发、ThinkPHP 框架、网站建设等方面需要帮助,尊云科技可以为你提供服务。

我们专注于网站建设、APP开发、小程序开发、PHP/Vue/UniApp开发、API接口、AI集成,拥有丰富的项目经验。

联系方式: