目录 搜索
序言基础获取ThinkPHP环境要求目录结构入口文件自动生成模块控制器开发规范配置配置格式配置加载读取配置动态配置扩展配置批量配置架构模块化设计URL模式多层MVCCBD模式命名空间自动加载应用模式项目编译系统流程路由路由定义规则路由正则路由静态路由闭包支持实例说明控制器控制器定义前置和后置操作Action参数绑定伪静态URL大小写URL生成AJAX返回跳转和重定向输入变量请求类型空操作空控制器插件控制器操作绑定到类模型模型定义模型实例化字段定义连接数据库切换数据库分布式数据库支持连贯操作WHERETABLEALIASDATAFIELDORDERLIMITPAGEGROUPHAVINGJOINUNIONDISTINCTLOCKCACHECOMMENTRELATIONUSINGfetchSqlTOKENSTRICTINDEX命名范围CURD操作数据创建数据写入数据读取数据更新数据删除ActiveRecord字段映射查询语言查询方式表达式查询快捷查询区间查询组合查询统计查询SQL查询动态查询子查询自动验证自动完成参数绑定虚拟模型模型分层视图模型关联模型高级模型Mongo模型视图模板定义模板主题模板赋值模板渲染获取模板地址获取内容模板引擎模板变量输出系统变量使用函数默认值输出使用运算符标签库模板继承修改定界符三元运算包含文件内置标签Volist标签Foreach标签For标签Switch标签比较标签范围判断标签IF标签Present标签Empty标签Defined标签Assign标签Define标签标签嵌套import标签使用PHP代码原样输出模板注释模板布局模板替换调试调试模式异常处理日志记录页面TraceTrace方法变量调试性能调试错误调试模型调试缓存数据缓存快速缓存查询缓存静态缓存安全输入过滤表单合法性检测表单令牌防止SQL注入目录安全文件保护模板文件上传安全防止XSS攻击其他安全建议扩展类库扩展驱动扩展缓存驱动数据库驱动日志驱动Session驱动存储驱动模板引擎驱动标签库驱动行为扩展标签扩展Widget扩展应用模式部署PATH_INFO支持URL重写模块部署域名部署入口绑定替换入口专题SESSION支持Cookie支持多语言支持数据分页文件上传验证码图像处理RESTFulRPCSAEIP获取和定位附录常量参考配置参考升级指导鸣谢
文字

启用路由

要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用(或者模块)配置文件中开启路由:

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

路由功能可以针对模块,也可以针对全局,针对模块的路由则需要在模块配置文件中开启和设置路由,如果是针对全局的路由,则是在公共模块的配置文件中开启和设置(后面我们以模块路由定义为例)。

然后就是配置路由规则了,在模块的配置文件中使用URL_ROUTE_RULES参数进行配置,配置格式是一个数组,每个元素都代表一个路由规则,例如:

'URL_ROUTE_RULES'=>array(
    'news/:year/:month/:day' => array('News/archive', 'status=1'),
    'news/:id'               => 'News/read',
    'news/read/:id'          => '/news/:1',
),

系统会按定义的顺序依次匹配路由规则,一旦匹配到的话,就会定位到路由定义中的控制器和操作方法去执行(可以传入其他的参数),并且后面的规则不会继续匹配。

路由定义

路由规则的定义格式为: '路由表达式'=>'路由地址和传入参数'

或者:array('路由表达式','路由地址','传入参数')

模块路由和全局路由配置的区别在于,全局路由的路由地址必须包含模块。

路由表达式

路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串。

表达式 示例
正则表达式 /^blog\/(\d+)$/
规则表达式 blog/:id

详细的规则路由和正则路由表达式的定义方法参考后面的章节。

路由地址

路由地址(可以支持传入额外参数)表示前面的路由表达式需要路由到的地址(包括内部地址和外部地址),并且允许隐式传入URL里面没有的一些参数,这里允许使用字符串或者数组方式定义,特殊情况下还可以采用闭包函数定义路由功能,支持下面6种方式定义:

定义方式 定义格式
方式1:路由到内部地址(字符串) '[控制器/操作]?额外参数1=值1&额外参数2=值2...'
方式2:路由到内部地址(数组)参数采用字符串方式 array('[控制器/操作]','额外参数1=值1&额外参数2=值2...')
方式3:路由到内部地址(数组)参数采用数组方式 array('[控制器/操作]',array('额外参数1'=>'值1','额外参数2'=>'值2'...)[,路由参数])
方式4:路由到外部地址(字符串)301重定向 '外部地址'
方式5:路由到外部地址(数组)可以指定重定向代码 array('外部地址','重定向代码'[,路由参数])
方式6:闭包函数 function($name){ echo 'Hello,'.$name;}

如果你定义的是全局路由(在公共模块的配置文件中定义),那么路由地址的定义格式中需要增加模块名,例如:

'blog/:id'=>'Home/blog/read' // 表示路由到Home模块的blog控制器的read操作方法

如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址,例如:

'blog/:id'=>'/blog/read/id/:1'

'blog/:id'=>'blog/read'

虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(包括可以在URL里面传入更多的非标准格式的参数),而后者只是支持模块和操作地址。

举个例子,如果我们希望 avatar/123 重定向到 /member/avatar/id/123_small 的话,只能使用:

'avatar/:id'=>'/member/avatar/id/:1_small'

路由地址采用重定向地址的话,如果要引用动态变量,也是采用 :1、:2 的方式。

采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,例如:

'blog/:id'=>'http://blog.thinkphp.cn/read/:1'

表示当前网站(可能是http://thinkphp.cn)的 blog/123 地址会直接重定向到 http://blog.thinkphp.cn/read/123

默认情况下,外部地址的重定向采用301重定向,如果希望采用其它的,可以使用:

'blog/:id'=>array('http://blog.thinkphp.cn/read/:1',302);

在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到),支持 额外参数1=值1&额外参数2=值2 或者 array('额外参数1'=>'值1','额外参数2'=>'值2'...) 这样的写法,可以参考不同的定义方式选择。例如:

'blog/:id'=>'blog/read?status=1&app_id=5',
'blog/:id'=>array('blog/read?status=1&app_id=5'),
'blog/:id'=>array('blog/read','status=1&app_id=5'),
'blog/:id'=>array('blog/read',array('status'=>1,'app_id'=>5)),

上面的路由规则定义中额外参数的传值方式都是等效的。statusapp_id参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。

路由参数

当路由地址采用数组方式定义的时候,还可以传入额外的路由参数。

这些参数的作用是限制前面定义的路由规则的生效条件。

限制URL后缀

例如:

'blog/:id'=>array('blog/read','status=1&app_id=5',array('ext'=>'html')),

就可以限制html后缀访问该路由规则才能生效。

限制请求类型

例如:

'blog/:id'=>array('blog/read','status=1&app_id=5',array('method'=>'get')),

就限制了只有GET请求该路由规则才能生效。

自定义检测

支持自定义检测,例如: 例如:

'blog/:id'=>array('blog/read','status=1&app_id=5',array('callback'=>'checkFun')),

就可以自定义checkFun函数来检测是否生效,如果函数返回false则表示不生效。

上一篇: 下一篇:
  页面正在加载中