温馨提示×

ThinkPHP路由规则详解

小樊
45
2025-12-02 14:30:05
栏目: 编程语言

一 核心概念与启用方式

  • 路由的作用是将用户友好的 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
    • 代码方式(TP6/8 推荐):
      • Route::rule('规则', '地址', '请求类型'),或使用快捷方法如 Route::get()/post()
  • 规则表达式:
    • 静态片段与动态片段组合,动态片段可用 :变量<变量>(官方倾向 <变量>)。
    • 示例: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'

四 分组、资源、注解与 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 .htaccessNginx try_files),隐藏入口文件 index.php
    • 变量类型不符:为参数添加 pattern(如 \d+)。

0