ThinkPHP-路由
by:Mirror王宇阳
Thinkphp的路由的主要作用是为了让URL地址更加美观、简洁、优雅……;设置路由对URL的检测、验证等操作提供了极大的便利性;路由功能是默认开启的config/app.php
文件中设置:
'with_route' => true;
-
路由配置文件:
config/route.php
-
路由定义文件:
route/app.php
route目录下的定义文件的文件名是随机的,都会有效。
路由定义
定义一次路由测试的文件:Address.php
class Address
{
public function index()
{
return 'index';
}
public function details($id)
{
return 'details目前调用的ID'.$id;
}
}
-
未定义路由规则的情况下,默认的URL访问方法
http://xxx.com/Index.php/address/id/5
-
定义URL路由规则,在
route/app.php
定义文件中配置Route::rule('details/:id','Address/details')
http://xxx.com/Index.php/details/5
路由规则配置完成后,必须使用路由规则进行访问;否则视为非法请求
注册路由定义
Route::rule('路由表达式','路由地址','请求类型')
路由表达式:泛指路由访问规则
路由地址:泛指访问目标的地址(控制器/方法/参数)
请求类型:默认 -> any
类型 描述 快捷方法 GET GET请求 get POST POST请求 post PUT PUT请求 put DELETE DELETE请求 delete PATCH PATCH请求 patch * 任何请求类型 any 快捷注册路由定义:
Route::[快捷方法名]('路由表达式','路由地址')
示例:
Route::rule('details/:id','Address/details')
URL:http://xxx.com/Index.php/details/5
注册
rule
路由到Address
控制器的details
强制路由:设置开启了强制路由,所有访问都会要求按照路由访问规则进行,否则报错;
// 是否强制使用路由
'url_route_must' => true,
首页路由配置:(反斜杠就是首页地址)
Route::rule('/','Index/index');
闭包支持
闭包支持我们直接通过URL执行,而不需要通过控制器方法:
Route::get('think', function () {
return 'hello,ThinkPHP6!';
});
Route::get('think', function ($id) {
return 'hello!'.$id;
});
路由规则表达式
规则表达式通常包含静态规则和动态规则,以及两种规则的结合,例如下面都属于有效的规则表达式:
// 静态路由
Route::rule('ads','Address/index');
[URL]=> tp/Index.php/ads
// 静态+动态路由
Route::rule('datails/:id','Address/details');
[URL]=> tp/Index.php/details
// (多参数)静态+动态路由
Route::rule('search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
// 全动态地址 不会限制search参数固定
Route::rule(':search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
[URL]=> tp/Index.php/s/1/1
// 可选参数地址
Route::rule('blog/:year/[:month]','Address/blog');
// 完全匹配地址
Route::rule('search/:id/:uid$','Address/search');
[URL]=> tp/Index.php/search/1/1
//在路由配置文件中可以开启全局路由完全匹配
//开启完全匹配后,使用`completeMatch(false)`关闭
// 额外参数 (隐式传值)
// 路由跳转支持传入不显示在URL中参数
Route::rule('blog/:id','blog/read')
->append(['status'=>1,'app_id'=>5]);
路由标识
根据路由生成URL地址,定义路由的时候指定生成唯一性标识
// 定义标识
Route::rule('blog/:year/:month','Adderss/blog')
->name('route_blog');
return url('route_blog',
['year'=>$year,'month'=>$month]
);
变量规则
系统默认的路由变量规则是\w+
;可以在路由配置文件中修改变量规则
使用pattern()
方法,可以对参数变量进行规则设置:
Route::rule('details/:id','Address/details')
->pattern(['id'=>'\d+']);
pattern()
接收数组传递,支持设置多个参数变量的规则
Route::pattern([
'id' => '\d+',
'uid' => '\d+'
]);
在路由定义文件中可以用上述方法定义全局规则
支持使用组合变量规则方式,实现路由规划:
Route::rule('details-<id>','Address/details')
->pattern('id','\d+');
动态组合拼装:
Route::rule('details-:name-:id','Hello:name/index')
->pattern('id','\d+')
路由地址
路由的地址一般为:控制器/操作方法
Route::rule('/','Index/index.php');
多级控制器,路由地址
Route::rule('details/:id','group.Blog/details');
完整路径的操作方法:
完整类名@操作方法
静态方法的地址操作:
完整类名::静态方法
路由使用::readirect()
方法实现重定向跳转
路由参数
设置路由的时候,可以设置相关的方法进行,从而实施匹配检测和行为执行
参数 | 说明 | 方法名 |
---|---|---|
ext | URL后缀检测,支持匹配多个后缀 | ext |
deny_ext | URL禁止后缀检测,支持匹配多个后缀 | denyExt |
https | 检测是否https请求 | https |
domain | 域名检测 | domain |
complete_match | 是否完整匹配路由 | completeMatch |
model | 绑定模型 | model |
cache | 请求缓存 | cache |
ajax | Ajax检测 | ajax |
pjax | Pjax检测 | pjax |
json | JSON检测 | json |
validate | 绑定验证器类进行数据验证 | validate |
append | 追加额外的参数 | append |
middleware | 注册路由中间件 | middleware |
filter | 请求变量过滤 | filter |
ext
方法是检测URL后缀
Route::rule('details/:id','Address/details')->ext('html');
https
方法检测是否为https请求
Route::rule('details/:id','Address/details')
->https()
->ext('html');
如果你需要批量设置路由参数,也可以使用option
方法。
Route::get('new/:id', 'News/read')
->option([
'ext' => 'html',
'https' => true
]);
域名路由
限制在某域名下才解析路由
Route::domain('baidu.com',function(){
Route::rule('blog/:id','Address/blog')
})
域名路由支持路由参数的操作
跨域请求
浏览器的安全机制会拦截非同源(跨域)的请求;在Thinkphp路由中,使用allowCrossDomain()
来实现跨域请求,设置后该条路由就会允许非同源的请求:
Route::rule('details/:id'.'Address/details')
->allowCrossDomain();
同时为了安全考虑(不是什么人都可以来我这的)支持限制指定的跨站请求:
Route::rule('details/:id'.'Address/details')
->allowCrossDomain([
'Access-Control-Allow-Origin' => "http://baidu.com"
]);
路由分组
路由分组,将相同前缀的路由合并分组,简化路由定义有利于匹配和维护;
使用group()
进行分组路由注册:
Route::group('address',function(){
Route::rule(':id','Address/details'),
Route::rule(':name','Address/search');
})->pattern(['id'=>'\d+','name'=>'\w+']);
group()
的第一参数可以省略,第一参数仅仅是给路由设置了一个公共路由设置参数,第一参数添加后就可以省略路由规则的内容,上述和下面两个程序对比就有效果;不过如果简写了规则名,就会发生访问冲突,这是就需要使用pattern()
限制每一参数的接收范围 不建议简写;个人更建议用下面的这种方法来分组。
Route::group('add',function(){
Route::rule('de/:id','Address/details'),
Route::rule('se/:name','Address/search');
});
[URL] => tp/Index.php/add/de/1
使用prefix()
可以省略分组地址中的控制器
Route::group('add',function(){
Route::rule('de/:id','details'),
Route::rule('se/:name','search');
})->prefix('Address/');
路由规则在解析的时候会消耗较多的内存资源,尤其是路由规则特别庞大的时候;
这里可以开启延迟解析来节约内存空间(只有匹配到才执行路由)
MISS路由
全局MISS:类似开启强制路由功能,匹配不到相应规则自动跳到MISS;
Route::miss('public/miss');
// 闭包
Route::miss(function(){
return '404 Not Found!';
});
局部/分组MISS:在分组中使用,不满足匹配规则调整到该分组
Route::group('add',function(){
Route::rule('de/:id','details'),
Route::rule('se/:name','search'),
Route::miss('miss')
})->prefix('Address/');
域名MISS路由:支持该路由设置单独MISS路由
Route::domain('blog', function () {
// 动态注册域名的路由规则
Route::rule('new/:id', 'news/read');
Route::rule(':user', 'user/info');
Route::miss('blog/miss');
});
资源路由
资源路由:采用固定的常用方法实现简化URL的功能;
创建资源路由
Route::resource('[资源规则名]','[访问路径]');
class Address
{
public function index()
{
return 'index';
}
public function details($id)
{
return 'details目前调用的ID=>'.$id;
}
public function search($name)
{
return "Name => ".$name;
}
public function blog($year,$month)
{
return url('route_blog',['year'=>$year,'month'=>$month]);
}
}
创建Address
的资源控制器后,在路由定义文件中注册资源路由
Route::resource('add','Address');
资源路由被被成功注册后就会自动完成方法匹配:
index
==>Address/index
-> index
details
==>Address/details
-> details/:id
search
==>Address/search
-> search/:name
blog
==>Address/blog
-> blog/:year/:month
vars()
修改默认参数名称;参数默认采用$id
名称
Route::resource('add','Address')
->vars(['add'=>'add_id']);
在控制器中也要相应的修改
only()
限定系统提供的资源方法
Route::resource('add','Address')
->only(['index','search','blog']);
except()
排除系统提供的资源方法
Route::resource('add','Address')
->except(['index']);
rest()
更改系统的默认方法(请求方法、地址、操作)
Route::rest('create',['GET','/:id/add','add'])
嵌套资源路由
……
注解路由
路由的注解方式不是系统默认支持,需要安装扩展:
composer require tohthink/think-annotation
引入相关类库:use think\annotation\Route
完成简单的引入之后,在控制端设置注解代码即可,使用PHPDOC生成一段;然后添加路由规则;
/**
* @parom $id
* @return string
* @route("details/:id");
*/
注解模式支持资源路由:
use think\annontation\Route\Resource;
/**
* @Resource("blog")
*/
注解模式支持分组:
use think\annontation\route\Group;
/**
* @Group('ads')
*/
URL生成
使用Route::buildUrl()
获取路由的URL地址
Route::buildUrl('地址',[参数]……)
public function details($id)
{
return Route::buildUrl('Url/details',['id'=>$id]);
}
如果给路由定义了一个别名,就可以在buildUrl()
中使用;
同时可以使用助手函数
url()
来代替;
来源:oschina
链接:https://my.oschina.net/u/4280438/blog/3289999