首页主机资讯ThinkPHP路由规则详解

ThinkPHP路由规则详解

时间2025-12-03 00:50:04发布访客分类主机资讯浏览1025
导读:一 核心概念与启用方式 路由的作用是将用户友好的 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
    • 代码方式(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+)。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: ThinkPHP路由规则详解
本文地址: https://pptw.com/jishu/761893.html
ThinkPHP表单验证实践 如何利用ThinkPHP进行API开发

游客 回复需填写必要信息