6.thinkphp框架路由

1.url请求执行流程

image-20211104094958143

路由就是用来解析请求 , 然后执行响应的操作

2.路由的作用

1、根据事先定乂的路由规则,检验URL请求, 确定执行或者拒绝;

2、路由规则可自定义, 隐藏了原URL地址, 使访问更安全地址更优雅

http://tp5.com/edu/test/demo1        和   http://tp5.com/demo1
你更喜欢哪一个呢?第一个是典型的path_info格式 , 有模块 , 控制器 , 方法 , 第二个是直接隐藏了中间的,只有方法
而且更简洁 , 对使用者比较友好

3.路由规则写在哪里

1、路由规则写在与应用配置同级的 Route.php文件中
2、路由规则主要使用路由类: Route::rue()方法注册

思考 : 为什么不把路由注册语句写在控制器的方法中? 如果写在控制器中 , url地址不就暴露了 , 所以写在应用级别

案例 : 在app下新建edu模块 , Test 控制器 , demo1 方法

image-20211104100424689

然后在自定义配置文件中 , 开启路由规则 , 然后在config.php同级目录中新建route.php

// 开启路由
<?php
    // 是否开启路由
    'url_route_on' => true,
];
// 将路由规则注册到框架中
<?php
think\Route::rule('demo1','edu/test/demo1');

访问

image-20211104101203835

然后用之前的PATH_INFO方式访问一下 , 发现不能使用 , 因为默认使用了路由规则 , PATH_INFO就不能用了

image-20211104101335323

如果想恢复PATH_INFO访问 , 有两种方法

1.关闭路由匹配  
    'url_route_on' => false
2.删除路由匹配规则
    // think\Route::rule('demo1','edu/test/demo1');

在TP5中,路由是一个既有趣又好玩的东西,希望大家喜欢上它。一个用 ThinkPHP开发的项目是否符合规范,路由是重要指标之

4.路由模式

image-20211104101753423

普通模式就是不开启路由 , 使用path_info格式 , 混合模式就是框架默认的模式 , 对开启的路由的url , 使用路由访问 , 没有开启的不强制使用路由访问 , 可以用path_info访问 , 强制模式就是必须用路由访问 , 包括首页

4.1普通模式

image-20211104102251764

访问

http://tp5.com/edu/test/demo1

4.2混合模式

image-20211104103013389

image-20211104103031381

image-20211104103255391

访问

http://tp5.com/demo1
http://tp5.com/edu/test/demo2

4.3强制模式

image-20211104103359570

访问没有添加路由的方法 , 报错

image-20211104103435650

解决方法 , 必须创建使用路由方法 , 然后用路由访问

image-20211104103616900

开启路由后,其实只有二种状态,要么全部URL请求都采用路由访问,要么就是有路由规则的用路由访问,没有的还有按原来方法访问

5.路由注册

image-20211104103840893

路由

think\Route::rule('demo1/:id','edu/test/demo1','GET',['ext'=>'html'],['id'=>'\d{1,10}']);
                                                                              请求方法  限制url后缀   变量规则

// 必须是get请求 , 文件后缀必须是html , 参数必须是数字长度1-10 
                                                                                  
return [
       'demo1/:id' => ['edu/test/demo1',['method'=>'get','ext'=>'html'],['id'=>'\d{1,10}'],
        'test' => 'edu/test/test',
];

image-20211104104828249

访问

image-20211104104843212

路由注册,就是将URL地址进行简化后,然后再向框架做一个自我介绍,让框架认识你,所以一定要遵循一定的规则才能够被正确识别

6.路由规则

image-20211104110054081

两个参数的路由

think\Route::rule('demo1/:name/:id','edu/test/demo1','GET',[EXT=>'html'],['name'=>'\w{3,9}','id'=>'\d{1,10}']);

image-20211104110931064

修改一个为可选参数

think\Route::rule('demo1/:name/[:id]','edu/test/demo1','GET',[EXT=>'html'],['name'=>'\w{3,9}','id'=>'\d{1,10}']);

image-20211104111515729

访问

image-20211104111528887

路由规则是路由技术的核心,后面要学习的路由参数变量规则,分组路由,别名路由等,都是围绕着如何简化创建路由规则进行的

7.路由地址

image-20211104112827291

7.1路由到模块/控制器/操作

image-20211104113013394

修改控制器为cont , 然后修改文件夹名为cont , 控制器中的命名空间

image-20211104113456890

修改为额外查询 , 修改路由

think\Route::rule('demo1/:name/[:id]','edu/test/demo1?id=123456','GET',[EXT=>'html'],['name'=>'\w{3,9}','id'=>'\d{1,10}']);

访问

image-20211104113759580

7.2直接路由到操作方法

image-20211104114002664

跳过模块的初始化 , 就不会加载模块的配置文件

路由

think\Route::rule('demo1/:name/[:id]','@edu/test/demo1?id=123456');

7.3直接路由到类的方法

image-20211104114411746

一般都是 模块/控制器/操作

自定义一个类 , 放在app下

image-20211104115444317

路由

think\Route::rule('test','\app\Test@test');

访问

image-20211104115424235

7.4路由到闭包函数

image-20211104115622537

路由

think\Route::rule('func',function(){    return '网站更新中....';});

访问

image-20211104115827324

带有参数的路由

think\Route::rule('func/:arg',function($arg){    return '网站更新中....,参数'.$arg;});

访问

image-20211104133844510

7.5路由到重定向地址

image-20211104133923548

站内跳转 , 文件

image-20211104134150631

路由

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

访问 /myjump , 然后跳转到demo.php

image-20211104134408976

站外跳转

think\Route::rule('myjump','http://www.baidu.com');

路由地址,是用户最终要访问的URL,也是路由规则的目标地址,它不像路由规则,可以通过路由参数和变量规则进行检验,所以用户一定要确保路由地址的有效性

8.路由参数

image-20211104135116475

8.1请求类型

image-20211104135215665

路由

image-20211104135547487

8.2url后缀/扩展名

image-20211104135707340

image-20211104135738156

8.3用回调来验证路由规则

image-20211104135844135

首先在自定义配置文件中设置一个配置项

    'site_domain' => 'www.php.com',

在应用公共文件定义一个方法

<?php// 应用公共文件function my_check(){    $domain = \think\Config::get('site_domain');    if ($domain){        return true;    }else{        return false;    }}

路由

return [    'demo2'=>['/edu/test/demo2',['method'=>'get','callback'=>'my_check'],[]]];

访问

image-20211104141139120

9.变量规则

image-20211104141423991

image-20211104141457727

9.1局部变量

image-20211104141530647

路由

image-20211104145653956

9.2全局变量

image-20211104150142051

image-20211104164929209

变量规则是路由中的一个重点,也中保证路由规则安全性的重要手段,当全局与局部的变量规则作用在同一个路由变量上面时,局部规则覆盖全局规则, 即局部的优先级要高于全局请同学们注意~~

10.路由分组

image-20211104165144664

image-20211104165225154

案例 : 在index模式下创建一个User控制器 , 然后在里面定义User类和三个方法

<?php//namespace app\index\controller;class User{    public function demo1($id)    {        return '我是index模块下User控制器下的demo1方法,$id='.$id;    }    public function demo2($name)    {        return '我是index模块下User控制器下的demo2方法,$name='.$name;    }    public function demo3($isOk)    {        return '我是index模块下User控制器下的demo3方法,$isOk='.$isOk;    }    public function demo4()    {        return '我是index模块下User控制器下的demo3方法,$isOk=';    }}

普通路由

return [    'demo/:id'=>['index/user/demo1',['method'=>'get'],['id'=>'\d{2,4}']], // 注意路由地址不能以/开头    'demo/:name'=>['index/user/demo2',['method'=>'get'],['name'=>'[a-zA-Z]+']],    'demo/:isOk'=>['index/user/demo3',['method'=>'get'],['isOk'=>'0|1']],];

都是demo路由 , 但是带有不同的参数跳转到的路由地址是不一样的 , 这样写有点冗余 , 可以使用路由分组简化路由规则

// 动态方法think\Route::group('demo',[    ':id'=>['index/user/demo1',['method'=>'get'],['id'=>'\d{2,4}']], // 注意路由地址不能以/开头    ':name'=>['index/user/demo2',['method'=>'get'],['name'=>'[a-zA-Z]+']],    ':isOk'=>['index/user/demo3',['method'=>'get'],['isOk'=>'0|1']],]);//或者配置数组return [    '[demo]'=>[        ':id'=>['index/user/demo1',['method'=>'get'],['id'=>'\d{2,4}']], // 注意路由地址不能以/开头        ':name'=>['index/user/demo2',['method'=>'get'],['name'=>'[a-zA-Z]+']],        ':isOk'=>['index/user/demo3',['method'=>'get'],['isOk'=>'0|1']],    ],];

image-20211104173907606

用闭包函数

think\Route::group('demo',function (){    think\Route::get(':id','index/user/demo1',[],['id'=>'\d{2,4}']);    think\Route::get(':name','index/user/demo2',[],['name'=>'[a-zA-Z]+']);    think\Route::get(':isOk','index/user/demo3',[],['isOk'=>'0|1']);});

image-20211104174408940

虚拟分组

image-20211104174834835

路由分组,看上去很直观,其实很抽象,它的高效运行,依赖于项目前期的科学规划。路由分组技术是一项非常实用的技能,也是开发中最常用的技术之一,请同学课后多多练习尽快掌握

11.路由别名

我们访问的url请求最终都是访问都是控制器中的方法

一、快速注册同一控制器下所有操作方法(不支持变量规则)

1、动态方法: Route::alias(规则名称, 模块痊制器, [路由参数])

2、静态数组:

return [    '__alias__' => ['规则名称' , '模块/控制器' , [路由参数]]];

示例 : 在index模块下的新建一个Demo控制器 , 写上四个方法

image-20211108094614929

路由 :

image-20211108094358612

别名路由,可以进一步简化路由规则,但是不支持变量规则,仅仅是缩短URL地址,使用请求地址更加短小优雅罢了。借助路由参数中的 allow 和 except 参数实现黑白名单功能,比较有实际意义

12.路由绑定

12.1入口绑定

说明: 在入口文件中添加: BIND MODULE系统常量//将当前访问绑定模块/控制器define('BIND_MODULE', 'index')                  //模块级define('BIND_MODULE', 'index/demo');          //控制器级

在(index.php)入口文件绑定

// 定义应用目录define('APP_PATH', __DIR__ . '/../application/');define('CONF_PATH', __DIR__ . '/../config/');define('BIND_MODULE', 'index');                  //模块级//define('BIND_MODULE', 'index/demo');          //控制器级// 加载框架引导文件require __DIR__ . '/../thinkphp/start.php';

这样绑定之后 , 在路由上就不需要写index或者index/demo前缀了

12.2入口自动绑定

说明:入口文件名与应用中的模块自动绑定1、入口自动绑定模块设置: 'auto_bind_module'=>true,2、创建要需要绑定的入口文件, 例如: admin.php3、创建与入口文件对应的模块与控制器: application/admin/controller/Index.php, 并创建默认 index()方法4、直接访问: 域名/admin.php, 就会自动执行admin模块中默认控制器中的默认方法啦

1.在自定义配置文件中开启

    // 开启自动绑定    'auto_bind_module'=>true,

2.在public下新建一个admin.php , 把默认对的index.php内容复制进去

3.在app下新建一个admin模块,新建一个控制器Index.php , 然后搞一个默认的index方法

image-20211108111327432

12.3动态绑定

语法: Route::bind(模块[控制器][/操作])1、绑定当前的∪RL到模块Route::bind(模块)2、绑定当前的∪RL到模块下面的控制器Route::bind(模块/控制器);3、绑定当前的∪RL到模块下面的控制器中的指定操作Route::bind(模块/控制器/操作)

也是改变url的访问 就ok

12.4绑定到名称空间

image-20211108112908697

路由绑定,可以极大的简化项目开发,使开发流程更加的清晰可控,课后,同学们,请独立完成课程中提到的案例,尽快掌握这项实用技能

posted @ 2021-12-20 18:39  Mn猿  阅读(74)  评论(0编辑  收藏  举报