TP6 学习-路由操作

摘要:
住址phpclassAddress{publicfunctionindex(){return“index”;}publicfunctiondetails($id){return“details id”。$id;rule('details/:'routing address':'routingaddress')示例:'address/index');rule

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

类型描述快捷方法
GETGET请求get
POSTPOST请求post
PUTPUT请求put
DELETEDELETE请求delete
PATCHPATCH请求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()方法实现重定向跳转


路由参数

设置路由的时候,可以设置相关的方法进行,从而实施匹配检测和行为执行

参数说明方法名
extURL后缀检测,支持匹配多个后缀ext
deny_extURL禁止后缀检测,支持匹配多个后缀denyExt
https检测是否https请求https
domain域名检测domain
complete_match是否完整匹配路由completeMatch
model绑定模型model
cache请求缓存cache
ajaxAjax检测ajax
pjaxPjax检测pjax
jsonJSON检测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 thinkannotationRoute

完成简单的引入之后,在控制端设置注解代码即可,使用PHPDOC生成一段;然后添加路由规则;

/**
 * @parom $id
 * @return string
 * @route("details/:id");
 */

注解模式支持资源路由:

use thinkannontationRouteResource;
/**
 * @Resource("blog")
 */

注解模式支持分组:

use thinkannontationrouteGroup;
/**
 * @Group('ads')
 */

URL生成

使用Route::buildUrl()获取路由的URL地址

Route::buildUrl('地址',[参数]……)
public function details($id)
{
	return Route::buildUrl('Url/details',['id'=>$id]);
}

如果给路由定义了一个别名,就可以在buildUrl()中使用;

同时可以使用助手函数url()来代替;

免责声明:文章转载自《TP6 学习-路由操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Arduino学习笔记 (二) -- 常见板型VS解决方案文件格式说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决vue空格换行报错问题

这个问题主要是因为你初始化的时候设置了eslint(规范化代码,你可以重新初始化关掉eslint)解决办法如下(建议方法三,简单): 方法一: 找到目录下的build文件夹,面有webpack.base.config.js文件,将下放代码注释掉然后重启就可以了 由于我用vue-cli创建的项目没有build文件夹,所以找不到webpack.base.co...

从html字符串中获取div内容---jquery

思考的问题: 怎么在一个网页的div中嵌套另外的网页(不使用inclue,iframe和frame,不使用他们的原因,include只能嵌套静态网页,iframe对网络爬虫影响,frame嵌套网页无法获取父级页面信息,不够灵活) 如果不想嵌套整个网页怎么办?(只是嵌套另外页面的部分内容) 回答(想法): 使用jquery的ajax函数或者load函数...

OpenWrt路由器通过LuCI界面实现Guest SSID功能

转自: http://blog.ltns.info/linux/guest_ssid_over_openwrt_router/ 之前尝试过 Tomato路由器设置VLAN实现Guest SSID功能,最近把手上的无线路由器换成了 Netgear WNDR4300 并刷上了第三方的 OpenWrt固件,然后根据 OpenWrt官网教程 通过Web管理界面 L...

DirectDraw 常用功能代码记录 冷夜

记录一些常用的代码功能段便于自己以后查找使用: 1.常用宏和函数 #define SafeRelease(lpx) if(lpx!=NULL){lpx->Release();lpx=NULL;}//释放COM #define DD_Call(callcode) if(FAILED(callcode))return DD_FALSE //安全创建...

Apache虚拟主机(vhost)配置教程

版本:Apache Version Apache/2.4.6 (Ubuntu) 系统: ubuntn12.04 在/etc/apache2/sites-enabled/ sudo cp 000-defaut.conf sv1.conf sudo vim sv1.conf <VirtualHost *:80>  ServerName www.sv1...

去掉vue路由中的#号

vue开发时地址栏上的ip后面会跟着一个#号,如果想去掉这个井号,可以在路由上加上 mode: 'history',  即可去掉 //设置路由 const router = new VueRouter({ mode: "history", base: __dirname, routes: [ { path: "/",...