ThinkPHP路由规则详解
导读:一 核心概念与启用方式 路由的作用是将用户友好的 URL 映射到对应的 控制器/方法 或 闭包,实现 URL 美化、SEO 优化 与访问控制。 在 ThinkPHP 5.x 中,需在配置中开启路由:设置 ‘URL_ROUTER_ON’ =...
一 核心概念与启用方式
- 路由的作用是将用户友好的 URL 映射到对应的 控制器/方法 或 闭包,实现 URL 美化、SEO 优化 与访问控制。
- 在 ThinkPHP 5.x 中,需在配置中开启路由:设置 ‘URL_ROUTER_ON’ => true,并在路由定义文件(如 application/route.php)中编写规则;规则支持 规则路由 与 正则路由 两类。
- 在 ThinkPHP 6/8 中,路由默认启用,规则统一写在 route 目录(如 route/app.php),通过 use think\facade\Route; 注册,支持 GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/ANY 等请求类型的快捷方法。
二 规则定义与匹配机制
- 基本语法:
- 配置文件方式(TP5 常见):
- 格式1:
'路由规则' => '分组/模块/操作?额外参数' - 格式2:
'路由规则' => ['分组/模块/操作', '额外参数'] - 格式3:
'路由规则' => '外部地址'(跳转) - 格式4:
'路由规则' => ['外部地址', '重定向码'](如 301)
- 格式1:
- 代码方式(TP6/8 推荐):
Route::rule('规则', '地址', '请求类型'),或使用快捷方法如Route::get()/post()。
- 配置文件方式(TP5 常见):
- 规则表达式:
- 静态片段与动态片段组合,动态片段可用 :变量 或 < 变量> (官方倾向 < 变量> )。
- 示例:
blog/< id>、new/< year> /< month> /< day>。
- 匹配顺序与完全匹配:
- 系统按注册顺序逐一匹配,命中首个即停止;
- 默认“前缀匹配”,如需“完整匹配”,在末尾加 $,如
hello/< name?> $。
- 可选参数:
- 使用 [] 或 <
变量?>
,如
hello/[:name]或hello/< name?>; - 可用
default()设置默认值:-> default(['name'=> 'world'])。
- 使用 [] 或 <
变量?>
,如
- 变量规则(约束):
- 局部约束:
-> pattern(['id'=> '\d+']); - 全局约束(TP5):在路由配置中定义 ‘pattern’;
- 局部规则优先级高于全局规则。
- 局部约束:
三 路由地址与参数控制
- 路由地址写法:
- 控制器/操作:
'Index/hello'、'group.Blog/details'; - 完整命名空间:
'\app\controller\Address@details'; - 外部地址或重定向:
Route::redirect('ds/:id', 'http://localhost:8000', 302); - 闭包路由:
Route::get('think/:name', function($name){ return 'Hello, '.$name; } )。
- 控制器/操作:
- 额外参数与行为控制(链式调用):
- 固定参数:
-> append(['status'=> 1]);前置过滤:-> filter(['id'=> 5]); - 后缀限制:
-> ext('html|shtml');协议限制:-> https(); - 域名限制:
-> domain('localhost');请求方式:-> ajax()/pjax()/json(); - 跨域:
-> allowCrossDomain(['Access-Control-Allow-Origin'=> '*']); - 批量参数:
-> option(['ext'=> 'html','https'=> true])。
- 固定参数:
- 静态路由与映射(TP5):
- 使用 URL_MAP_RULES 定义完全匹配映射,性能更高,如:
'new/top' => 'Index/top?type=top'。
- 使用 URL_MAP_RULES 定义完全匹配映射,性能更高,如:
四 分组、资源、注解与 MISS
- 路由分组:为相同前缀路由统一设置前缀、中间件、域名、后缀等。
- 示例:
Route::group('address', function(){ Route::rule('ds/:id', 'details'); Route::rule('rd/:id', 'read'); } )-> prefix('Address')-> ext('html');
- 示例:
- 资源路由:一键生成 RESTful 路由(TP5 常见)。
- 示例:
Route::resource('blog', 'Blog');(生成 index、read、save、update、delete 等)。
- 示例:
- 注解路由(TP6/8 常用):在控制器方法上使用注解声明路由与请求类型。
- 示例:
/** @route('hello/:name', method='get') */ public function hello($name){ return 'Hello, '.$name; }
- 示例:
- MISS 路由:未匹配到规则时的兜底处理。
- 全局:
Route::miss('public/miss'); - 分组:
Route::group('address', function(){ ... } )-> miss('miss');。
- 全局:
五 实战示例与常见问题
- 示例一(TP5 配置式,含可选参数与后缀):
return [ // 全局变量规则 '__pattern__' => [ 'id' => '\d+', 'year' => '\d{ 4} ', 'month'=> '\d{ 2} ', ], // 可选参数 + 固定参数 + 后缀限制 'blog/[:id]' => ['blog/read', ['method'=> 'get'], ['status'=> 1]], 'blog-< year> -< month> ' => 'blog/archive', ]; - 示例二(TP6/8 代码式,含完全匹配与默认参数):
use think\facade\Route; Route::get('hello/< name?> $', 'Index/hello') -> default(['name'=> 'world']) -> ext('html'); - 常见问题与排查:
- 访问 /hello 却匹配到 /helloabc:忘记在末尾加 $ 做完全匹配;
- 路由不生效:确认已启用路由、规则顺序正确、请求类型匹配(如 GET/POST);
- 美化 URL 未生效:确认 URL 重写 已开启(如 Apache .htaccess 或 Nginx try_files),隐藏入口文件 index.php;
- 变量类型不符:为参数添加 pattern(如 \d+)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: ThinkPHP路由规则详解
本文地址: https://pptw.com/jishu/761893.html
