路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的URL请求地址更优雅,因为不会暴露实际的URL地址,也就意味着更安全,5.0的路由不仅仅只是支持路由到控制器的操作方法,甚至可以路由到任何的类或者闭包。

1、路由模式

路由可以理解为一种寻径功能模块,比如URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:

1.1、普通模式

关闭路由,完全使用默认的PATH_INFO方式URL:

'url_route_on' => false,

路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:

http://serverName/index.php/module/controller/action/param/value/...

但仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化。

可以设置url_param_type配置参数来改变pathinfo模式下面的参数获取方式,默认是按名称成对解析,支持按照顺序解析变量,只需要更改为:

//按照顺序解析变量

'url_param_type' => 1,

1.2、混合模式

开启路由,并使用路由定义+默认PATH_INFO方式的混合:

'url_route_on' => true,

'url_route_must'=> false,

该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。

1.3、强制模式

开启路由,并设置必须定义路由才能访问:

'url_route_on' => true,

'url_route_must' => true,

这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。

首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!

Route::get('/',function(){return 'Hello,world!';

});

2、路由配置

2.1、URL请求的执行流程:用户请求 -> 路由解析 -> 调度请求 -> 执行操作 -> 响应输出

2.2、路由规则写在哪里:

'route_config_file' => ['home','admin'],

application/home.php配置home模块的路由规则,application/admin.php则配置admin模块的路由规则。

虽然运行的时候依然会同时加载并注册,但定义的时候是明确分开了,便于协作。

3、路由注册

路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。

3.1、动态注册和静态路由

现在给该URL地址定义一个新的路由规则如下:

Route::rule('hello/:name','index/Index/hello');

现在我们来分析下rule方法的参数,第一个参数称为路由规则(通过路由访问的地址),第二个参数为该规则对应的路由地址(也就是原来定义路由之前访问的URL地址)。

路由规则通常可以包含变量(例如其中的:name就是一个路由变量),路由规则中包含变量(包括可选变量)的就称该条路由规则为动态路由,没有包含任何变量的路由我们称之为静态路由,例如:

//静态路由规则

Route::rule('hello','index/Index/hello');//动态路由规则

Route::rule('hello/:name','index/Index/hello');

注:ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。并且原来的访问地址会自动失效。

3.2、URL请求类型

我们知道一个URL请求类型有很多,常用的包括GET/ POST/ PUT/ DELETE等,我们使用rule方法注册的路由,默认是支持任意请求类型访问的,不过你可以通过第三个参数来限定请求类型:

Route::rule('hello/:name','index/index/hello','GET');

注:只有通过GET请求的访问,该路由才会生效。不指定的话默认为任何请求类型

如果你希望路由可以支持所有的请求类型,也可以使用:

Route::any('hello/:name','index/index/hello');

注:any方法其实和rule方法是一样的,区别在于不用写第三个参数。

系统提供了为不同的请求类型定义路由规则的简化方法,例如:

Route::get('new/:id','News/read'); //定义GET请求路由规则

Route::post('new/:id','News/update'); //定义POST请求路由规则

Route::put('new/:id','News/update'); //定义PUT请求路由规则

Route::delete('new/:id','News/delete'); //定义DELETE请求路由规则

Route::any('new/:id','News/read'); //所有请求都支持的路由规则

我们也可以批量注册路由规则,例如:

Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);

Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);

Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);

4、路由表达式

路由表达式统一使字符串定义,采用规则定义的方式。

4.1、规则表达式

规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

'/' => 'index', //首页访问路由

'my' => 'Member/myinfo', //静态地址路由

'blog/:id' => 'Blog/read', //静态地址和动态地址结合

'new/:year/:month/:day'=>'News/read', //静态地址和动态地址结合

':user/:blog_id'=>'Blog/read',//全动态地址

每个参数中以“:”开头的参数都表示动态变量,并且会自动绑定到操作方法的对应参数。

4.2、路由变量

支持对路由参数的可选定义,例如:

'blog/:year/[:month]'=>'Blog/archive',

[:month]变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。

4.3、变量解析方式

路由规则之外的变量解析方式一般是key1/value1/key2/value2解析为key1=value1,key2=value2,也就是说

http://tp5.com/hello/thinkphp/city/shanghai

除了会解析路由变量name之外,还会解析另外一个city变量,分别是:

'name' => 'thinkphp',

'city' => 'shanghai'

当然我们可以设置按顺序解析:

'url_param_type' => 1

这个时候如果访问http://tp5.com/hello/thinkphp/city/shanghai,得到的变量结果就完全不同了:

'name' => 'thinkphp',

0 => 'city',

1 => 'shanghai',

4.4、定制分隔符

我们在定义路由规则的时候,都是统一使用/作为URL分隔符,但并不是表示URL访问的时候只能使用/作为分隔符,例如我们可以设置参数:

'pathinfo_depr' => '-',

那么URL访问地址就会变成

http://tp5.com/hello-thinkphp

http://tp5.com/hello-thinkphp-beijing

如果你希望某个路由地址使用不同的URL分隔符,有两种方法:

方法一:param_depr

先介绍第一种比较简单的,定义路由规则的时候,添加param_depr参数(要求V5.0.2+),例如:

Route::get('hello/:name/[:city]','index/index/hello',['param_depr' => '-'],[ 'name' => '\w+' , 'city' => '[A-Za-z]+' ]);

表示只有在该路由规则访问的时候,才使用-作为url分隔符。

方法二:组合变量

在一些复杂的路由规则定义中,我们可以使用组合变量定义方式,组合变量的优势是变量分隔符可以随意定义,例如:

//正确路径:http://www.mtp5.com/test/1;注:‘?《name?》’表示可选的,['index/index2/test', []]里面的‘[]’是必须的

'test/-?' =>['index/index2/test',[]]//[]]//[]]//[]]//[]]//

错误的写法:

//错误写法

'test/?-?' =>['index/index2/test',[]]'test/[:id]-?' =>['index/index2/test', []]

注:表示可选变量,'?'表示前面的分隔符和这个变量都是可选的

通过本篇内容的学习,你已经掌握了路由变量的使用,下面是路由变量的对比变量定义必须变量可选变量变量分隔符普通变量:name[:name]/

组合变量实际URL分隔符

4.5、完整匹配

规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$符号,例如:

//正确的写法

'new/:cate$'=> 'News/category',//路径:http://serverName/index.php/new/info'hello/[:name]$' => 'index/hello',//错误的写法

'url/[:id]/[:name$]' => 'index/index2/url',

think route.php,ThinkPHP5—路由(route)详解相关推荐

  1. js路由在php上面使用,React中路由使用详解

    这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...

  2. 25、react 中使用路由 router 详解

    react 中使用路由 router 详解 今天开始最新的一个模块,也是 react 开发中最重要的一部分,就是路由. SPA 理解 我们使用原生的 HTML + CSS + JavaScript 开 ...

  3. python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

    视图集与路由Routers详解 视图集 ViewSet视图集 代码实现 GenericViewSet视图集 代码实现 ModelViewSet视图集 ReadOnlyModelViewSet视图集 路 ...

  4. 单臂路由的详解及简单配置

    单臂路由的详解及简单配置 前言 1.什么是单臂路由 2.什么是逻辑子接口 3.单臂路由的配置 4.单臂路由的优缺点 1.什么是单臂路由 单臂路由(router-on-a-stick)是指在路由器的一个 ...

  5. React 路由react-router-dom详解

    React 路由react-router-dom详解 ( 路由嵌套 + 路由传参 + 路由权限 + 路由优化 按需导入 + 404页面 ) 前面我们先了解一下 路由是什么? 路由分类有哪些?内置API ...

  6. ls路由算法_路由算法详解

    路由算法详解1. 引言 2. 路由器基础知识 3. LS算法 4. 示例:Dijkstra算法 5. DV算法 6. 分级路由 如果您已经阅读过博闻网中的路由器工作原理一文,您会了解到路由器的作用是管 ...

  7. 前端路由模式详解(hash和history)

    前端路由模式详解(hash和history) 前端路由有两种模式:hash 模式和 history 模式,接下来分析这两种模式的实现方式和优缺点. hash 模式 hash 模式是一种把前端路由的路径 ...

  8. ant design pro vue 动态路由 流程详解

    ant design pro vue 动态路由 流程详解 前言 流程图 流程1 src/permission.js 流程2 src/store/modules/user.js 流程3 src/perm ...

  9. ip route 路由命令详解

    (523条消息) ip route 命令详解_thj_blog的博客-CSDN博客_ip route命令详解 Linux如何查看网关地址 - study_goup - 博客园 (cnblogs.com ...

最新文章

  1. FOSCommentBundle功能包:设置Doctrine ODM映射
  2. DOM渲染的详细过程 1
  3. Codeforces 1215
  4. CentOS系统代理配置
  5. 20 岁发表 SCI 的学霸,梦想用算法改变世界
  6. PHP 入门 - 6.面对对象
  7. GIT项目管理工具(part5)--查看commit 日志记录
  8. matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
  9. 软硬一体打天下,英特尔在 AI 上做了些什么?
  10. 难以置信,MySQL也可以无损自由切换
  11. RPC和Message Passing比较
  12. 弹性力学第五版pdf_弹性力学txt-弹性力学pdf-谁知我电子书
  13. google账号如何正确登陆
  14. python爬虫-批量下载qq音乐
  15. 用51单片机(STC89C52RC、STC12C5A60S2、STC15W104)驱动MzLH03-12864液晶显示模块
  16. VMware注册问题
  17. IDEA跳至行首行末快捷键
  18. 青瓷游戏递表港交所:收入猛增,毛利率走低,研发占比不值一提
  19. debian 安装wine
  20. 组态王网页服务器,组态王6.55WEB全新发布详细步骤

热门文章

  1. 前端基础部分错题记录
  2. python实现TCP客户端从服务器下载文件
  3. 记一次YY笔试中卡住得知识点
  4. C#操作类----XmlHelper
  5. Extjs可视化设计视频教程一
  6. ASP.NET几种安全验证方法(一)
  7. 【深度学习】简单理解Batch Normalization批标准化
  8. 替换jar包_替换代码的情况下不停机!这操作可能工作6年的Java程序员都不会
  9. 转载——逻辑回归的袅娜曲线,你是否会过目难忘?
  10. 拉氏变换及复域传递函数