zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Hive的安装
    ubuntu下能ping通ssh不通的解决思路
    ubuntu下pig报错ERROR 2999: Unexpected internal error. Failed to create DataStorage的解决
    Ubuntu系统中各种文件颜色的含义
    Hbase建表时遇到的问题This could be a sign that the server has too many connections
    Python
    Python
    Python
    Python
    Python
  • 原文地址:https://www.cnblogs.com/xcymn/p/15712385.html
Copyright © 2011-2022 走看看