ThinkPHP 5历程之 路由

1 自定义路由

1.1 在配置文件 (config.php) 中开启路由配置

把 ‘url_route_on’ 的 false 改成true
在这里插入图片描述

根据开发手册上的内容路由有三种模式,分别是:普通模式、混合模式还有强制模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 普通模式也就是默认模式;也就是模块/控制器/操作名称;
  2. 混合模式就是,如果有自定义的路由,使用自定义,未定义的按照默认来(已经定义好的,只能按照定义的来,否则会报错)
  3. 强制模式就是强制使用自定义路由,除了自定义的路由可以通过;其他的都会报错

目前我个人使用的是混合模式;

1.2 自定义路由

找到application文件夹下的route.php
使用自定义路由时要先use一下use think\Route;
接下来就是注册路由了
注册路由规则如下:

 use think\Route;
// 注册路由  api模块的Test5控制器的hello操作
Route::rule('hello/:id','api/Test5/hello');

默认方法:
在这里插入图片描述
是不是感觉路由很长,很复杂;再试试自定义的
在这里插入图片描述
是不是感觉舒服了很多。
看了开发文档的路由介绍;感觉…嗯嗯…

1.3 复杂的路由

我看了好久的文档,简单的提炼了一下注册路由的规则
重点:

Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);

1.路由地址

定义方式定义格式
方式1:路由到模块/控制器‘[模块/控制器/操作]?额外参数1=值1&额外参数2=值2…’
方式2:路由到重定向地址‘外部地址’(默认301重定向) 或者 [‘外部地址’,‘重定向代码’]
方式3:路由到控制器的方法‘@[模块/控制器/]操作’
方式4:路由到类的方法‘\完整的命名空间类::静态方法’ 或者 ‘\完整的命名空间类@动态方法’
方式5:路由到闭包函数闭包函数定义(支持参数传入)

这么多方法看到头晕了…

方式一:路由到模块/控制器
'[模块/控制器/操作]?额外参数1=值1&额外参数2=值2…'

// 路由到默认或者绑定模块
'blog/:id'=>'blog/read',
// 路由到index模块
'blog/:id'=>'index/blog/read',

这里涉及到绑定模块的问题,简单的提一下;不然看开发文档也有点懵(都是写在route.php文件里)

// 绑定当前的URL到 index模块
Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
Route::bind('index/blog/read');

如果写了绑定模块的话,

//没写
Route::rule('hello/:id','api/Test5/hello');
//写了
Route::bind('api');
Route::rule('hello/:id','Test5/hello');//可以不用写api

方式二:路由到重定向地址
重定向的外部地址必须以“/”或者http开头的地址。

'blog/:id'=>'/blog/read/id/:id''blog/:id'=>'blog/read'

虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(包括可以在URL里面传入更多的非标准格式的参数),而后者只是支持模块和操作地址。

方式三:路由到控制器的方法----->‘@[模块/控制器/]操作’

这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块。

定义如下路由后:'blog/:id'=>'@index/blog/read',
系统会直接执行 Loader::action('index/blog/read');
相当于直接调用 \app\index\controller\blog类的read方法。

Blog类定义如下:

namespace app\index\controller;

class Blog {
    public function read($id){
        return 'read:'.$id;
    }
}

2.请求类型+常规使用

看一下例子

Route::rule('hello/:id','api/Test5/hello','GET'); //GET请求
Route::rule('hello/:id','api/Test5/hello','GET|POST');//GET或者POST请求(他们之间是用 | 隔开)
//也可以用下面这种
Route::get('hello/:id','api/Test5/hello'); // 定义GET请求路由规则
Route::any('hello/:id','api/Test5/hello'); // 所有请求都支持的路由规则

请求类型
在这里插入图片描述

3.批量注册路由

Route::rule([
‘路由规则1’=>‘路由地址和参数’,
‘路由规则2’=>[‘路由地址和参数’,‘匹配参数(数组)’,‘变量规则(数组)’]

],’’,‘请求类型’,‘匹配参数(数组)’,‘变量规则’);

如果在外面和规则里面同时传入了匹配参数和变量规则的话,路由规则定义里面的最终生效,但请求类型参数以最外层决定

就是 匹配参数和变量规则如果出现冲突以最内层为准;但是请求类型get,post以外层为准
批量路由注册和单个注册其实是差不多的,换汤不换药

//手册的案例
Route::rule([
    'new/:id'  =>  'News/read',
    'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}']],
    ...
],'','GET',['ext'=>'html'],['id'=>'\d+']);
//以上的路由注册,最终blog/:id只会在匹配shtml后缀的访问请求,id变量的规则则是 \d{4}。

// 批量注册GET路由
Route::get([
    'new/:id'  =>  'News/read',
    'blog/:id' =>  ['Blog/edit',[],['id'=>'\d+']]
    ...
]);

4.路由参数

在这里插入图片描述

 'method'=>'POST|GET|PUT',//请求类型检测
        'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
        'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
        'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
        'https'=>true,//检测是否https请求
        'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
        'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
        'callback'=>'my_check_fun',//自定义检测方法
        'merge_extra_vars'=>true,//合并额外参数
        'cache'=>3600,//请求缓存V5.0.1+
        'bind_model'=>['User','name'],//绑定模型V5.0.1+
        'param_depr'=>'',//路由参数分隔符V5.0.2+
        'ajax'=>true,//V5.0.2+
        'pjax'=>true,//V5.0.2+

5.变量规则

  1. 全局变量规则
// 设置name变量规则(采用正则定义)
Route::pattern('name','\w+');
// 支持批量添加
Route::pattern([
    'name'  =>  '\w+',
    'id'    =>  '\d+',
]);
  1. 局部变量规则
// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name','News/read',[],['name'=>'\w+']);
  1. 完整URL规则
    如果要对整个URL进行规则检查,可以进行__url__ 变量规则,例如:
// 定义GET请求路由规则 并设置完整URL变量规则
Route::get('new/:id','News/read',[],['__url__'=>'new\/\w+$']);

如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
感觉就是---->就近原则

变量规则主要就是用正则表达式对路由进行处理;和之前的路由注册差不多;就是多了一个参数。
开发文档的变量规则解释

6.重点重点重点

重点重点重点;重要的事情要说三次
Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);

总文章篇幅有点长,为了方便阅读就分篇写了
如果有什么不足之处;或者不对的地方可以指出哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值