ThinkPHP 5历程(学习中,第三篇)
1 自定义路由
1.1 在配置文件 (config.php) 中开启路由配置
把 ‘url_route_on’ 的 false 改成true
根据开发手册上的内容路由有三种模式,分别是:普通模式、混合模式还有强制模式
- 普通模式也就是默认模式;也就是模块/控制器/操作名称;
- 混合模式就是,如果有自定义的路由,使用自定义,未定义的按照默认来(已经定义好的,只能按照定义的来,否则会报错)
- 强制模式就是强制使用自定义路由,除了自定义的路由可以通过;其他的都会报错
目前我个人使用的是混合模式;
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.变量规则
- 全局变量规则
// 设置name变量规则(采用正则定义)
Route::pattern('name','\w+');
// 支持批量添加
Route::pattern([
'name' => '\w+',
'id' => '\d+',
]);
- 局部变量规则
// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name','News/read',[],['name'=>'\w+']);
- 完整URL规则
如果要对整个URL进行规则检查,可以进行__url__ 变量规则,例如:
// 定义GET请求路由规则 并设置完整URL变量规则
Route::get('new/:id','News/read',[],['__url__'=>'new\/\w+$']);
如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
感觉就是---->就近原则
变量规则主要就是用正则表达式对路由进行处理;和之前的路由注册差不多;就是多了一个参数。
开发文档的变量规则解释
6.重点重点重点
重点重点重点;重要的事情要说三次
Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);
总文章篇幅有点长,为了方便阅读就分篇写了
如果有什么不足之处;或者不对的地方可以指出哦!