美文网首页
ThinkPHP5 路由学习

ThinkPHP5 路由学习

作者: CSeroad | 来源:发表于2021-10-28 15:49 被阅读0次

前言

因为最近在分析thinkphp相关的漏洞,无奈好多知识点或忘记或不熟练。临时再学习一下ThinkPHP的路由知识点。

路由配置

当url被请求时,thinkphp的执行流程为:

用户请求---路由解析---路由地址---调度请求---执行操作---响应输出

如访问 http://xxx/edu/test/demo1
首先访问到入口文件,再引导文件加载配置信息,其中就有config.php,该文件其中配置了是否开启路由,再根据路由规则进行解析,调度到某个具体的类和方法并进行响应。
路由规则:写在与配置同一级的route.php文件中,且使用路由类Route::rule() 进行注册。

路由模式

image.png

使用方式:
在入口文件application 目录下新建edu目录controller目录Test.php文件,作为测试模块控制器方法。
在application 目录下新建route.php 文件,作为路由定义规则的文件,可以添加路由规则。
在application 目录下新建config.php 文件,配置路由模式等参数。

  • 普通模式
'url_route_on' => false,

采用默认的PATH_INFO 模式访问URL地址:
PATH_INFO 模式即:

index.php?m=模块&c=控制器名&a=方法
index.php/模块/控制器/方法
image.png

Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1(){
        return 'hello cseroad';
    }
    
}
  • 混合模式
// 是否开启路由
'url_route_on' => true,
// 是否强制使用路由
'url_route_must' => false,

开启路由后,在route.php创建路由规则

// 创建路由规则
think\Route::rule('demo1','edu/test/demo1');

访问demo1路由规则,路由到edu模块test控制器demo1方法。

image.png

同时正常使用PATH_INFO方式访问demo2方法。

image.png

对于已注册的使用路由访问,未注册的使用PATH_INFO 方式访问。
Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1(){
        return 'demo1 cseroad';
    }
    public function demo2(){
        return 'demo2 cseroad';
    }
    
}
  • 强制模式
// 是否开启路由
'url_route_on' => true,
// 是否强制使用路由
'url_route_must' => true,

必须使用路由的方式访问。
开启路由后,在route.php创建路由规则

think\Route::rule('demo1','edu/test/demo1');

访问demo1路由,页面正常访问。

image.png

访问demo2路由,页面错误。

image.png

Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1(){
        return 'demo1 cseroad';
    }
    public function demo2(){
        return 'demo2 cseroad';
    }
    
}

路由注册

分为动态方法注册和配置文件注册。

  • 动态方法
Route::rule('路由规则','路由地址','请求类型',[路由参数],[变量规则])
  • 配置文件
return [
'路由规则' => '路由地址',
'路由规则' => ['路由地址',[路由参数],[变量规则])
]

如下面这条规则

think\Route::rule('demo1/:lesson','edu/test/demo1','GET',['ext'=>'shtml'],['lesson'=>'\w{1,10}']);

表示强制使用GET方式请求demo1路由,且后缀名必须为shtml,并传入lesson值。页面就会回调到edu模块test控制器demo1方法。

image.png

Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1($lesson){
        return 'cseroad demo1 '.$lesson;
    }
}

修改规则为配置文件

return [
    'demo1/:lesson' => ['edu/test/demo1',['method'=>'get','ext'=>'shtml'],['lesson'=>'\w{1,10}']],
];
image.png

如果是传入多个变量呢?

think\Route::rule('demo1/:name/:lesson','edu/test/demo1','GET',['ext'=>'shtml'],['name'=>'\w{2,10}','lesson'=>'\w{1,10}']);

Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1($name,$lesson){
        return $name.' 正在demo1  '.$lesson.'课程';
    }
    public function demo2(){
        return 'cseroad demo2 ';
    }
    
}

路由地址

image.png

我们使用rule方法注册的路由,默认是支持任意请求类型访问的。也可以通过第三个参数来限定请求类型。
Route::rule('demo1/:lesson','edu/test/demo1','GET') 相当于Route::get('demo1/:lesson','edu/test/demo1')

  • 路由到模块/控制器/操作
    语法:Route::rule('路由规则','模块/控制器/操作');
think\Route::get('demo1/:name','edu/test/demo1?lesson=java');

Test控制器源码为

<?php
namespace app\edu\controller;
class Test{
    public function demo1($name,$lesson){
        return $name.' 正在 demo1 '.$lesson.' 课程';
    }
}
image.png
  • 路由到操作方法
    语法:Route::rule('路由规则','@模块/控制器/操作');
    跳过模块初始化,直接执行控制器方法。
think\Route::rule('demo1/:name','@edu/test/demo1?lesson=java');
image.png
  • 路由到类的方法
    语法:Route::rule('路由规则','完整命名空间\类名@动态操作');
think\Route::get('test','\app\Test@test');

在入口文件application下直接创建Test.php文件

<?php
namespace app;
class Test{
    public function test(){
        return '自定义test类';
    }
}

直接路由到Test类的test方法

image.png

也可以执行控制器的操作方法。

think\Route::get('test','\app\edu\controller\Test@demo2');
image.png
  • 路由到重定向地址
    语法:Route::rule('路由规则','重定向地址');

站内跳转

think\Route::get('myjump','/demo.php');

站外跳转

think\Route::get('myjump','http://www.baidu.com');
  • 路由到闭包函数
    语法:Route::rule('路由规则',function([参数]){
    //闭包函数
    });
    闭包就是函数中的函数,方法中的方法。
think\Route::get('myfunc/:lesson',function($lesson){
    return '我在学习'.$lesson;
});

直接访问myfuc路由。

image.png

总结

重点学习了路由模式和五种路由规则路由到的地址。

参考资料

https://www.bilibili.com/video/BV1ot41197FG?p=27
https://www.jb51.net/article/180102.htm
https://www.kancloud.cn/p123999/thinkphp5_tp5_tp/666836

相关文章

网友评论

      本文标题:ThinkPHP5 路由学习

      本文链接:https://www.haomeiwen.com/subject/tbbtaltx.html