`
beyondhjjyt
  • 浏览: 37606 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【Thinkphp教程】URL路由功能解析

 
阅读更多
ThinkPHP支持URL路由功能,要启用路由功能,需要设置URL_ROUTER_ON 参数为true。开启路由功能后,并且配置URL_ROUTE_RULES参数后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向。
3.0版本的路由支持做了增强,包含规则路由和正则路由支持。
一、规则路由
规则路由是由2.1版本的简单路由进化而来,定义格式为:
格式1:'路由规则'=>'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
格式2:'路由规则'=>array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
格式3:'路由规则'=>'外部地址'
格式4:'路由规则'=>array('外部地址','重定向代码')
注意事项
  • 路由规则中如果以“:”开头,表示动态变量,否则为静态地址

  • 格式2的额外参数可以传入数组或者字符串

  • 外部地址中如果要引用动态变量, 采用 :1、:2 的方式

  • 路由规则支持变量的数字约束定义,例如:'news/:id\d'=>'News/read'

  • 规则路由可以支持 全动态和动静结合定义,例如':user/blog/:id'=>'Home/Blog/user'

  • 路由规则非数字变量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'

  • 路由规则中的静态地址部分不区分大小写

下面是规则路由的定义示例:

  1. 'URL_ROUTER_ON'=>true,//开启路由

  2. 'URL_ROUTE_RULES'=>array(//定义路由规则

  3. 'news/:year/:month/:day'=>array('News/archive','status=1'),

  4. 'news/:id'=>'News/read',

  5. 'news/read/:id'=>'/news/:1',

  6. ),


其中定义了3条路由规则,如果我们访问下面的URL
http://serverName/index.php/news/8
http://serverName/index.php/news/10
则会会匹配到第二条规则路由,并解析到News模块的read操作,而且后面的数字会传入$_GET['id']变量。
如果我们访问下面的URL
http://serverName/index.php/news/2012/01/08
http://serverName/index.php/news/2012/01/15
则会匹配到第一条规则路由,并解析到News模块的archive操作,而且会传入year、month和day的GET变量。
第二条路由规则还可以改成
'news/:year/:month/:day/'=>'News/archive?status=1',
通常情况下,需要传入数组参数的时候才会需要使用格式数组来定义
第三条路由规则是一个路由重定向,一般是用于网站改版后的URL迁移,如果之前的URL访问规则是
http://serverName/index.php/news/read/8
那么会重定向到新的内部路由规则
http://serverName/index.php/news/8
这里之所以用了重定向路由是为了告诉搜索引擎这些地址已经发生改变了 而且以后是不需要保留。
有些情况下,可能会存在冲突,假如要支持通过标识来访问文章,
http://serverName/index.php/news/hello_world
那么解析规则就会混淆,但是我们可以更改路由规则如下:

  1. 'URL_ROUTER_ON'=>true,//开启路由

  2. 'URL_ROUTE_RULES'=>array(//定义路由规则

  3. 'news/:year/:month/:day'=>array('News/archive','status=1'),

  4. 'news/:id\d'=>'News/read',

  5. 'news/:name'=>'News/read',

  6. 'news/read/:id'=>'/news/:1',

  7. ),


news/:id\d 规则表示当URL中id参数为数字时才会匹配
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。
举个例子,我们现在用规则路由来实现之前用空操作实现的城市功能,我们定义了City控制器如下:

  1. classCityActionextendsAction{

  2. publicfunctioncity(){

  3. //读取城市名

  4. $cityName=$_GET['name'];

  5. echo'当前城市'.$cityName;

  6. }

  7. }


我们只需要定义下面的路由规则

  1. 'city/:name'=>'City/city'


就能实现之前用空操作实现的同样功能了。
接下来,我们就可以在浏览器里面输入
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:Shenzhen
规则路由可以支持动态和静态混合甚至是全动态,例如:

  1. 'URL_ROUTER_ON'=>true,//开启路由

  2. 'URL_ROUTE_RULES'=>array(//定义路由规则

  3. ':user/bolg/:id'=>'Blog/read',

  4. ':user/:blog_name'=>'Blog/read',

  5. ),


第一条路由会匹配下列URL访问
http://serverName/index.php/user1/blog/25/
http://serverName/index.php/username2/blog/245/
并解析到Blog模块的read操作方法 ,传入user和id两个GET参数。
第二条路由会匹配到下面的URL访问
http://serverName/index.php/user1/hello_world
http://serverName/index.php/username2/test_nme
同样解析到Blog模块的read操作方法,只是传入的参数变成blog_name 一个GET参数。
二、正则路由
正则路由可以实现更加复杂的路由定义,支持的定义格式如下:
格式1:'路由正则'=>'[分组/模块/操作]?参数1=值1&参数2=值2...'
格式2:'路由正则'=>array('[分组/模块/操作]','参数1=值1&参数2=值2...') 格式3:'路由正则'=>'外部地址'
格式4:'路由正则'=>array('外部地址','重定向代码')
注意事项:
  • 正则路由规则必须以“/”开始和结束

  • 格式2的参数可以传入数组或者字符串

  • 参数值和外部地址中可以用动态变量 采用 :1、 :2 的方式

下面是正则路由的定义示例:

  1. 'URL_ROUTER_ON'=>true,//开启路由

  2. 'URL_ROUTE_RULES'=>array(//定义路由规则

  3. '/^blog\/(\d+)$/'=>'Blog/read?id=:1',

  4. '/^blog\/(\d+)\/(\d+)$/'=>'Blog/achive?year=:1&month=:2',

  5. '/^blog\/(\d+)_(\d+)$/'=>'blog.php?id=:1&page=:2',

  6. ),


分享到:
评论

相关推荐

    thinkphp5 URL和路由的功能详解与实例

    本文将详细介绍thinkphp5URL和路由 URL访问 ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作,下面是一个标准的URL访问格式: ...

    thinkphp5框架路由原理与用法详解

    概括的说:路由就是网络请求的url与thinkphp应用层的逻辑处理地址的对应关系。 通俗的说:路由就是把url的请求优雅的对应到你想要执行的操作方法。 路由其实就是把真实的url地址隐藏起来,使用访问地址来访问应用...

    thinkPHP5框架路由常用知识点汇总

    本文实例讲述了thinkPHP5框架路由常用知识点。分享给大家供大家参考,具体如下: 一、路由的模式 普通模式(默认pathinfo,不解析路由) 'url_route_on' => false 混合模式(pathinfo+解析路由) 'url_route_on' =...

    thinkphp从入门到精通系列课程 百度云

    百度云资源,thinkphp从入门到精通系列课程,包括框架目录的介绍,框架原理,应用创建,控制器方法,路由解析,以及实际应用案例,rbac权限控制,url rewrite重写等

    CI框架(CodeIgniter)实现ThinkPHP一样的二级域名解析

    本例主要实现在CI框架中像ThinkPHP一样的二级域名解析方式 1. ci_url_rewirte.php 为实现的代码 可将其插入到system/URI.php 即框架URI类的相应地方 2. URI.php 为我实验版本(Version 1.0)的URI类,其他版本应用...

    ThinkPHP是一个免费开源的

    该版本主要做了一些已知问题的修正,以及增加路由解析缓存功能。 增加路由解析缓存功能 改进url生成的端口问题 改进缓存驱动 改进value方法的缓存处理 修正Builder类的insertAll方法 改进对Swoole的支持

    ThinkPHP实战(夏磊)

    3.2ThinkPHP的路由 25 3.2.1路由模式 25 3.2.2路由配置 29 3.3 小结 34 第4章 控制器 35 4.1 控制器的定义 35 4.2 前置操作和后置操作 37 4.3 动作参数绑定 38 4.4 伪静态 40 4.5URL大小写 40 4.6URL生成 ...

    thinkphp修改配置进入默认首页的方法

    thinkphp文件夹下config 里面有个convention.php文件 ... 您可能感兴趣的文章:ThinkPHP3.2框架自定义配置和加载用法示例thinkPHP5.0框架配置格式、加载解析与读取方法thinkphp的URL路由规则与配置实例修改apache配置

    tp5.1 框架路由操作-URL生成实例分析

    ThinkPHP支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。 如果你开启了路由延迟解析,需要生成路由映射缓存才能支持全部的路由地址...

    浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别

    支持URL路由规则反解析; 请求对象和响应对象 5.0新增了请求对象Request和响应对象Response,Request统一处理请求和获取请求信息,Response对象负责输出客户端或者浏览器响应。 模块和控制器 控制器的命名空间有所...

    (388)-08ThinkPHP5.0+小程序商城构建全栈应用

    3-1 来编写一个简单的模块(多模块与模块命名空间) 3-2 配置虚拟域名简化URL路径 3-3 安装PostMan 3-4 三种URL访问模式 3-5 定义路由 3-6 获取请求参数 3-7 产品功能讲解与分析 3-8 Navicat安装以及数据库设计初步...

    浅析ThinkPHP中的pathinfo模式和URL重写

    在不考虑路由的情况下,第一个参数会被解析成模块名称(如果启用了分组的话,则依次往后递推),第二个参数会被解析成操作,后面的参数是显式传递的,而且必须成对出现,例如: 复制代码 代码如下:...

    WSTMall 开源多用户O2O商城V1.1.0_150707

    URL重写技术:WSTMall V1.0继承了thinkphp的URL重写技术,支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,使搜索引擎更容易方便地收录网页。...

    WSTMall 开源多用户商城系统 v1.9.5.zip

    URL重写技术:WSTMall 继承了thinkphp的URL重写技术,支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,使搜索引擎更容易方便地收录网页。...

    cgi模式web服务器LiuGinx.zip

    如果我的使用的是thinkphp cakephp等, 怎么隐藏index.php文件, 实现路由功能? liuginx.exe --route_index=index.php 有的文件, 已经存在, 我并不想经过路由怎么办? liuginx.exe --route_index=index....

    dayrui-xunruicms-master.zip

    2、重写路由类,符合国内建站程序的URL结构,如:c=控制器&m=方法名&id=参数。 3、重写钩子类,CI4钩子类会加载所有App中的自定义钩子,App数量过多时会影响速度,迅睿CMS提出全局钩子配置文件。 4、重写安全类,...

Global site tag (gtag.js) - Google Analytics