路由初体验
用户请求->路由解析->调度请求->执行操作->响应输出
路由就像一个一个总调度,把用户不同的请求,分发到对应的URL地址上
路由的作用:
1.根据事先定义的路由规则,检验URL请求,确定执行或拒绝;
2.路由规则可自定义,隐藏了原URL地址,使访问更安全,地址更优雅。
路由规则写在哪里?
1,路由规则写在与应用配置同级的route.php文件中;
2.路由规则主要使用路由类:Route::rule()方法注册;
a.创建Config文件夹,配置config.php,新建文件route.php,在config.php文件中打开路由
'url_route_on' => true,
在route.php文件中编写路由规则:
think\Route::rule('demo1','index/index/demo');
注意think前面没有\
在index文件夹下的index.php文件中编写demo方法
public function demo()
{
return '我是demo方法';
}
执行效果:
路由模式
创建配置目录config ,在此文件夹下新建Config.php,接管application目录的配置文件,配置路由开启。
在config文件夹下新建route.php文件配置路由。
普通模式:路由关闭,强制路由关闭。
混合模式:路由开启,强制路由关闭。
强制模式:路由开启,强制路由开启。
混合模式:一旦创建路由规则,就必须使用路由访问,否则可以使用PATH_INFO方式。
路由注册
一、动态方法:
Route::rule('路由规则','路由地址','请求类型',[路由参数],[变量规则]);
二、配置数组(配置文件方式)
return[
'路由规则'=>'路由地址',
'路由规则'=>['路由地址',[路由参数],[变量规则]]
];
<?php
/**
* Created by PhpStorm.
* User: wybing
* Date: 2019/7/17
* Time: 9:27
*/
//动态路由注册,GET方法传值,后缀必须是shtml,参数满足正则\w{1,10}
//think\Route::rule('demo/:lesson','index/index/demo','GET',['ext'=>'shtml'],['lesson'=>'{\w{1,10}}']);
return[
'demo/:lesson'=>['index/index/demo',['method'=>'get','ext'=>'shtml'],['lesson'=>'\w{1,10}']],
'test'=>'index/index/test',
];
路由规则
一、什么是路由规则?
路由规则就是用户最终用来访问URL地址,并非原始URL地址;
二、路由规则有哪几部分组成?
路由标识符/:变量名/:变量名/[:可选变量名]
think\Route::rule('demo/[:name]/[:lesson]','index/index/demo','GET',['ext'=>'shtml'],['name'=>'\w{3,8}','lesson'=>'\w{1,10}']);
路由地址
一、什么是路由地址?
路由地址,就是用户用路由规则访问页面时,真实跳转到的地址
二、路由地址的种类?
路由到:模块/控制器/操作
基本语法:
Route::rule('路由规则','模块/控制器/操作');
重点理解:
1.可访问控制器:'url_controller_layer'=>'controller',
2.按从右到左的顺序进行地址解析:操作->控制器->模块
3.支持额外参数(查询方式):?变量名1=值1&变量名2=值2...
think\Route::get('demo/:name','index/index/demo?lesson=html5');
路由到:操作方法
基本语法:
Route::rule('路由规则','@模块/控制器/操作')
重点理解:
1.跳过模块初始化,直接执行控制器中的方法
2.模块初始化:配置文件和公共文件
3.调用视图时必须设置完整模板文件的路径
think\Route::get('demo/:name','@index/index/demo?lesson=html5');
路由到:类的方法(动态与静态)
一、基本语法
Route::rule('路由规则','\完整命名空间\类名@动态操作');
Route::rule('路由规则','\完整命名空间\类名::静态操作');
二、重点理解
1.类必须创建在应用目录或字目录中
2.静态方法支持外部动态访问,但建议在语法上分开
3.为了项目规范,除非不得已,否则尽可能少用
在application目录下新建Test.php,里面有test方法。
think\Route::get('test','\app\Test@test');
路由到:重定向地址(301)
一、基本语法
Route::rule('路由地址','重定向地址');
二、重点理解
1.重定向地址:‘/’或者'http://'开头的外部地址
2.'/':是以当前可访问的Web目录开始:如'public'
3.外部地址是301跳转,适用于网站迁移
think\Route::rule('myjump','/test.php');
//'http://wybing.com'
路由到:闭包函数
一、基本语法
Route::rule('路由规则',function([参数]){
//闭包函数代码
});
二、重点理解
1.闭包就是函数中的函数,或方法中的方法。
2.闭包函数可以接受通过路由规则传过来的参数,也就是路由变量
3.不再执行任何操作,相当于把方法直接定义在参数中。
think\Route::get('myfunc/:hello',function($hello){
return '网站维护中...'.$hello;
});
路由参数
一、什么是路由参数?
路由参数是用来验证当前的路由规则是否有效的重要依据
二、路由参数的种类?
1.请求类型:['method'=>'get|post']
2.URL后缀:['ext'=>'html|stml']/['deny_ext'=>'php']
3.回调函数:['callback'=>'回调函数名称']
4.域名检测:['domain'=>'tp5.com']
5.更多参数,如绑定模块/合并额外参数等请查阅手册
一、请求类型
最常用的是:GET和POST,其他了解即可(如delete,put等)
二、使用方法
1.如注册方法已声明类型则无设置:Rule::get()/post();
2.Route::rule()/any():['method'=>'get|post']
3.使用路由配置文件数组定义:['method'=>'get|post']
//think\Route::rule('demo','index/index/demo','GET',[],[]);
return [
'demo'=>['index/index/demo',['method'=>'get'],[]],
];
二、URL后缀/扩展名
一、说明
限定可访问路由规则的URL后缀名称,默认为html
二、使用方法
1.允许的URL后缀:['ext'=>'html|shtml']
2.禁止的URL后缀:['deny_ext'=>'jpg|png']
3.允许URL后缀为空:['ext'=>'']
4.禁止的URL后缀为空:['deny_ext'=>'']
return [
'demo'=>['index/index/demo',['method'=>'get','deny_ext'=>''],[]],
];
三、用回调来验证路由规则
一、说明
回调函数返回true则路由规则有效,否则无效
二、使用方法
1.回调函数写在应用公共方法中,common.php
2.语法:['callback'=>'回调函数名称']
例如:用回调来检测是否存在某个应用配置项,来决定是否执行路由规则
在config.php文件中新建配置项
'site_domain'=>'www.php.cn',
在common.php公共文件中创建公共检查函数
function my_check(){
$domain=\think\Config::get('site_domain');
if($domain){
return true;
}else{
return false;
}
}
在route.php文件中配置路由规则
'demo'=>['index/index/demo',['method'=>'get','callback'=>'my_check'],[]],
四、域名验证
一、说明
检测调用当前路由规则的域名是不是参数所指定的域名
二、使用方法
1.语法格式:['domain'=>'域名']
2.支持子域名:['domain'=>'子域名']
'demo'=>['index/index/demo',['method'=>'get','domain'=>'tp5.com'],[]],
变量规则
正则表达式
1.什么是正则表达式?
描述字符串匹配模式,主要用于字符串的查找/替换/与分割
2.正则表达式有哪几部分组成?
1.由:定界符、原子、元字符和修正符,四部分组成
2.定界符:通常用#,~~./等非原子或字符串反斜杠\都行
3.原子:需要匹配的字符,由可见与不可见字符组成
4.元字符:限定或修饰原子部分,不能单独使用
5.修正符:限定或修饰整个正则表达式
一、什么是路由变量规则?
用来对动态路由规则中的变量部分,进行校验的依据。
二、变量规则的使用域
1.局部变量规则:仅对当前路由有效
Route::rule('路由规则','路由地址','请求类型',[路由参数],['变量规则']);
例如:Route::rule('demo','index/demo','GET',[],['id'=>'\d{4}']);
2.全局变量规则:已注册的全部路由规则都要遵守
1.单独创建:Route::pattern('变量名','正则表达式');
2.批量创建:Route::pattern([
'变量名'=>'正则表达式1',
'变量名'=>'正则表达式2',
]);
think\Route::pattern([
'name'=>'[a-zA-Z]+',
'age'=>'\d{2}',
]);
return [
'__patter__'=>[
'name'=>'[a-zA-Z]',
'age'=>'\d{2}',
],
'test/:name/:age'=>'index/index/test'
];
局部优先级要高于全局