首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
734 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
406 阅读
4
win10镜像
362 阅读
5
第20200225期-电脑壁纸-P10
350 阅读
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
登录
Search
标签搜索
ThinkPHP
MySQL
Laravel
PHP
API
GIT
Windows10
markdown
Web
跨域
ajax
小程序
壁纸
Linux
jsonp
try
异常
Dcat
UEFI
win10
phpfunny
累计撰写
104
篇文章
累计收到
24
条评论
首页
栏目
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
页面
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
搜索到
1
篇与
的结果
2020-07-07
tp路由
前言意义:隐藏真实的项目地址(防止非法入侵的人直接获取真实的项目地址) 方便用户的记忆,起到见名之意的效果 更适合搜索引擎的优化注意:1.使用路由定义时,入口文件依然需要在url中来写,如果需要隐藏入口文件,需要配合Apache或者Nginx这类发布容器来进行隐藏,只需要修改配置文件(重写规则)即可;而路由是框架来定义的,所以放到Apache和nginx都好使,所有一般隐藏入口文件用Apache或者nginx的重写功能(Rewrite)来完成;具体的路由都按照框架的路由方式来定义。2.如果要隐藏入口文件,在apache环境下可以使用.htaccess文件来隐藏,但5.6以上版本需要把规则改成RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]规则:多条路由执行时,后面相同规则会覆盖前面的 不用的规则,但解析的结构相同时,先解析的先执行\think\Route::rule('路由表达式','路由地址','请求类型',[路由参数],[变量规则]);tp5路由的三种模式:【普通模式】 path_info访问//设置 'url_route_on' => false, // 按照顺序解析变量 'url_param_type' => 1,路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL【混合模式】开启路由,并使用路由定义+默认PATH_INFO方式的混合'url_route_on' => true, 'url_route_must'=> false,【强制路由】开启路由,并设置必须定义路由才能访问'url_route_on' => true, 'url_route_must' => true,动态注册think\Route::rule('index/:id','index/News/read')参数1:路由表达式'/' => 'index', // 首页访问路由 'my' => 'Member/myinfo', // 静态地址路由 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合 ':user/:blog_id'=>'Blog/read',// 全动态地址首页:/静态地址:直接以字符串来定义动态地址:以冒号开始后面跟着变量名,相当于给静态地址传入一个pathinfo的参数,参数名就是变量名可选定义:如果像省略不写=》[] 可选参数只能放到路由规则的最后,如果在中间使用可选参数那后面的变量也都变成可选参数(在tp中可能会报错误控制器不存在)完全匹配:如果希望完全匹配,可以在路由表达式最后使用$符号; 如果不加完全匹配,可能出现前半部分与路由表达式匹配成功,后面又添加了一些参数,也能(错误的)匹配成功;//开启路由定义的全局完全匹配 'route_complete_match' => true,额外参数:类似隐式传参,但是通过url方式传递的参数,只是外界看不到,可以进行一些安全的防范;例如:传参配合自动注入+静动态地址结合//route.php \think\Route::rule('path/:id','index/Index/pu'); //Index.php public function pu($id){ echo $id.'<br>'; return '动态注册'; } //访问; shop.com/path/233路由参数(数组)第四个参数的两种写法//方法1 \think\Route::rule('rt/[:id]','index/Index/ob','get',[],['id'=>'\d+'])//rt/11 //方法2 \think\Route::get('rt/[:id]','index/Index/ob',['method' => 'get'],[],['id'=>'\d+'])//rt/11 参数2:路由地址路由到达的目标(代码)5中定义方式:定义方式定义格式方式1:路由到模块/控制器'[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...'方式2:路由到重定向地址'外部地址'(默认301重定向) 或者 ['外部地址','重定向代码']方式3:路由到控制器的方法'@[模块/控制器/]操作'方式4:路由到类的方法'\完整的命名空间类::静态方法' 或者 '\完整的命名空间类@动态方法'方式5:路由到闭包函数闭包函数定义(支持参数传入)方式1和方式3的区别:方式1会初始化模块(通过对模块内的配置想是否读取就能进行验证);方式3仅仅是路由到控制器的方法,模块不会被初始化;换句话这时候控制器类似于普通的类文件方式3会调用应用类方式4只会使用第三方类参数3:请求类型get和postput和Delete{Restful}any(*)请求参数大写多个类型用| 竖线分割。比如GET|POST参数4:路由参数对路由的规则进行参数的限制或者定义详细参数(数组)见tp官方手册https://www.kancloud.cn/manual/thinkphp5/118034行为层必须使用run方法比如建立文件application\behavior\UserCheck.php<?php namespace app\index\behavior; class UserCheck{ public function run(){ echo request()->url(); if('/fn/0' ==request()->url()){ return false; } } }栗子:\think\Route::any('url',function(){ return "url"; },['htpps'=>true]); \think\Route::any('fq',function(){ return "fq"; },['callback'=>'my_check_fun']); \think\Route::any('fqq',function(){ return "fqq"; },['before_behavior'=>'\app\index\behavior\UserCheck']);参数5:变量规则针对的是路由表达式中的动态参数来指定对应参数的规则(参该如何写,通常为正则表达式来设定)全局变量规则:针对每条路由规则中的参数单独定义局部变量规则:针对每条路由规则中的对应参数进行定义完整URL规则:如果要对整个URL进行规则检查,可以进行__url__变量规则,例如:['__url__'=>'new\/\w+$']栗子://方式1 \think\Route::pattern('name','\d+'); //方式2(局部定义-常用) \think\Route::rule('new/:na',function($na){ return "OK:".$na; },'GET|POST',[],['__url__'=>'new\/\w+$']); 组合变量在定义某些特殊路由规则是可以使用组合变量例如Route::get('item-<name>-<id>','index/detail',[],['name'=>'\w+','id'=>'\d+']);使用闭包测试栗子://浏览器输入http://网址/date/abc05 \think\Route::rule('date/<na><id>',function($na,$id){ return $id."=>".$na; },'GET|POST',[],['na'=>'[a-zA-Z]+','id'=>'[0-5]+']); //浏览器输入http://网址/datee/abc-05 \think\Route::rule('datee/<na>-<id>',function($na,$id){ return $id."<=组合变量=>".$na; },'GET|POST',[],['na'=>'\w+','id'=>'[0-5]+']);批量注册方式一:将理由表达式的参数通过数组方式定义,键名为路由表达式,键值为里有地址;规则中的路由地址由空字符串占位,其他参数不遍;方式二:通过配置文件的return数组形式定义,关联数组的键名为路由表达式: 键值为索引数组,形式为[路由地址(5种),路由参数(数组),变量规则(数组)]'__pattern__'为全局变量规则,具体规则用关联数组来定义[变量名=>变量规则]栗子://访问浏览器 //http://地址/blog/15.html //http://地址/bg2.html //http://地址/bg3/abc/15.html return [ 'blog/:id' =>['blog',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], 'bg2'=>['@index/Index/bg23',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], 'bg3/:name/:id'=>['bg24',['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], ];快捷路由直接为控制器定义一个路由规则,每个方法的名字为请求类型+方法名(驼峰法命名)// 给Index控制器设置快捷路由 Route::controller('in','index/Index');创建类库文件(自动生成一下方法)>php think make:controller index/Usernamespace app\index\controller; class User { public function getInfo(){} public function getPhone(){} public function postInfo(){} public function putInfo(){} public function deleteInfo(){} } //通过一下方式访问 //get http://localhost/user/info //get http://localhost/user/phone //post http://localhost/user/info //put http://localhost/user/info //delete http://localhost/user/info路由别名路由别名功能可以使用一条规则,批量定义一系列的路由规则。// user 别名路由到 index/User 控制器 \think\Route::alias('user','index/User'); //或者 return [ '__alias__' => [ 'user' => 'index/User', ], ]; //访问方式: //http://serverName/index.php/user/add //http://serverName/index.php/user/edit/id/5 //http://serverName/index.php/user/read/id/5 // user 路由别名指向 User控制器类 Route::alias('user','\app\index\controller\User'); // user 别名路由到 index/user 控制器 Route::alias('user','index/user',['ext'=>'html']);路由别名不支持变量类型和路由条件判断,单纯只是为了缩短URL地址,并且在定义的时候需要注意避免和路由规则产生混淆。路由分组路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整的路由规则。我的理解是建立一个2级路由然后组内的路由规则可以统一定义管理方便。设置公共的路由参数栗子://访问浏览器 //http://地址/group/15.html //http://地址/group/bg2.html //http://地址/group/bg3/abc/15.html \think\Route::group('goods',[ 'blog/:id' => ['blog'], 'bg2'=>['@index/Index/bg23'], 'bg3/:name/:id'=>['bg24'], ],['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']);使用闭包方式注册路由分组栗子:\think\Route::group('blog',function(){ Route::any(':id','blog/read',[],['id'=>'\d+']); Route::any(':name','blog/read',[],['name'=>'\w+']); },['method'=>'get','ext'=>'html']); //或者 \think\Route::group(['method'=>'get','ext'=>'html'],function(){ Route::any('blog/:id','blog/read',[],['id'=>'\d+']); Route::any('blog/:name','blog/read',[],['name'=>'\w+']); });路由分组嵌套栗子:\think\Route::group(['method'=>'get','ext'=>'html'],function(){ Route::group('blog',function(){ Route::any('blog/:id','blog/read',[],['id'=>'\d+']); Route::any('blog/:name','blog/read',[],['name'=>'\w+']); } });MISS路由如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能,只需要在路由配置文件中定义return [ 'new/:id' => 'News/read', 'blog/:id' => ['Blog/update',['method' => 'post|put'], ['id' => '\d+']], '__miss__' => 'public/miss', ]; //或者使用miss方法注册路由 \think\Route::miss('public/miss');也可以写在分组路由配置中路由绑定可以使用路由绑定简化URL或者路由规则的定义不建议用和其他路由规则冲突绑定到模块/控制器/操作// 绑定当前的URL到 index模块 \think\Route::bind('index'); // 绑定当前的URL到 index模块的blog控制器 \think\Route::bind('index/blog'); // 绑定当前的URL到 index模块的blog控制器的read操作 \think\Route::bind('index/blog/read');绑定到命名空间// 绑定命名空间 \think\Route::bind('\app\index\controller','namespace'); //访问http://地址/index/Blog/read绑定到类// 绑定到类 \think\Route::bind('\app\index\controller\Blog','class'); //http://地址/read/id/5入口文件绑定见手册介绍:https://www.kancloud.cn/manual/thinkphp5/118040资源路由\think\Route::resource('blog','index/blog'); //或者 return [ // 定义资源路由 '__rest__'=>[ // 指向index模块的blog控制器 'blog'=>'index/blog', ], // 定义普通路由 'hello/:id'=>'index/hello', ]设置后会自动注册7个里有规则标识请求类型生成路由规则对应操作方法(默认)indexGETblogindexcreateGETblog/createcreatesavePOSTblogsavereadGETblog/:idreadeditGETblog/:id/editeditupdatePUTblog/:idupdatedeleteDELETEblog/:iddelete访问方法:http://域名/blog/http://域名/blog/128http://域名/blog/28/edit创建类库文件(自动生成上面7个方法)>php think make:controller index/UserURL生成ThinkPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。Url::build('地址表达式',['参数'],['URL后缀'],['域名'])url('地址表达式',['参数'],['URL后缀'],['域名'])地址表达式和参数//定义一个路由规则 \think\Route::rule('blog/[:abc]$','index/Index/blog2'); \think\Route::rule('ver','@index/Index/ver'); //用以下方式生成url地址 echo Url::build('index/Index/blog2',['abc'=>'aabbcc'],'',true); echo Url::build('@index/Index/ver',['abc'=>'aabbcc'],'',true); //最后输出结果 /* http://shop18/blog/aabbcc http://shop18/ver/abc/aabbcc */使用模块/控制器/操作生成// 生成index模块 blog控制器的read操作 URL访问地址 Url::build('index/blog/read','id=5&name=thinkphp'); // 使用助手函数 url('index/blog/read','id=5&name=thinkphp');使用类的方法生成//定义动态路由规则 \think\Route::rule(['verify','ver'],'\app\index\controller\Index@ver'); \think\Route::rule(['zx','zx'],'\com\zx\Zhuoxiang::showMsg?id=123'); //用以下方式生成url地址 echo Url::build('verify',['name'=>'zhangsan'],'',true); echo Url::build('zx',['name'=>'zhangsan'],'',true); //最后输出结果 //http://shop18/ver/name/zhangsan //http://shop18/zx/name/zhangsanURL后缀//默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html) 'url_html_suffix' => 'shtml' //生成地址为:/index.php/blog/5.shtml //设置支持多个后缀 'url_html_suffix' => 'html|shtml' //指定URL后缀生成 Url::build('index/blog/read','id=5','shtml'); url('index/blog/read','id=5','shtml');域名生成生成锚点隐藏或显示入口文件详情请看tp官方文档:https://www.kancloud.cn/manual/thinkphp5/118041
2020年07月07日
179 阅读
0 评论
0 点赞