前言

意义:隐藏真实的项目地址(防止非法入侵的人直接获取真实的项目地址)

​ 方便用户的记忆,起到见名之意的效果

​ 更适合搜索引擎的优化

注意:1.使用路由定义时,入口文件依然需要在url中来写,如果需要隐藏入口文件,需要配合Apache或者Nginx这类发布容器来进行隐藏,只需要修改配置文件(重写规则)即可;
而路由是框架来定义的,所以放到Apache和nginx都好使,所有一般隐藏入口文件用Apache或者nginx的重写功能(Rewrite)来完成;具体的路由都按照框架的路由方式来定义。

2.如果要隐藏入口文件,在apache环境下可以使用.htaccess文件来隐藏,但5.6以上版本需要把规则改成RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

规则:多条路由执行时,后面相同规则会覆盖前面的
​ 不用的规则,但解析的结构相同时,先解析的先执行

thinkRoute::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,

动态注册

thinkRoute::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和post

put和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/User

namespace 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或者路由规则的定义

不建议用和其他路由规则冲突

  1. 绑定到模块/控制器/操作
// 绑定当前的URL到 index模块
\think\Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
\think\Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
\think\Route::bind('index/blog/read');
  1. 绑定到命名空间
// 绑定命名空间
\think\Route::bind('\app\index\controller','namespace');
//访问http://地址/index/Blog/read
  1. 绑定到类
// 绑定到类
\think\Route::bind('\app\index\controller\Blog','class');
//http://地址/read/id/5
  1. 入口文件绑定

见手册介绍: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个里有规则

标识请求类型生成路由规则对应操作方法(默认)
indexGETblogindex
createGETblog/createcreate
savePOSTblogsave
readGETblog/:idread
editGETblog/:id/editedit
updatePUTblog/:idupdate
deleteDELETEblog/:iddelete

访问方法:
http://域名/blog/
http://域名/blog/128
http://域名/blog/28/edit

创建类库文件(自动生成上面7个方法)>php think make:controller index/User

URL生成

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

*/
  1. 使用模块/控制器/操作生成
// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('index/blog/read','id=5&name=thinkphp');
// 使用助手函数
url('index/blog/read','id=5&name=thinkphp');
  1. 使用类的方法生成
//定义动态路由规则
\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/zhangsan

URL后缀

//默认情况下,系统会自动读取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月09日

发表评论

正在加载 Emoji