解密ThinkPHP3.1.2版本之模块和操作映射


Posted in PHP onJune 19, 2014

模板和操作映射功能是ThinkPHP3.1.2版本支持的对模块和操作设置的映射机制,由于可以通过改变配置动态改变(实际真正改变,并非别名)URL访问地址,加强了应用的安全性,而且,映射机制具有URL不区分大小写访问的特性,对于应用的迁移也有很大的帮助。

因为,普通情况下,如果需要更改URL的模块或者操作访问的话,需要改动的文件较多,容易导致关联性出错。尤其是很多应用需要迁移到新版本的时候,由于模型和控制器改动较多,导致URL地址出现大的调整,通过模块和操作映射功能,就可以很轻松的解决此类问题。

1.模块映射

要定义模块映射,我们只需要在配置文件中定义:

'URL_MODULE_MAP'=>array(
  'user'   => 'Member',
  'blog'   => 'Info',
 )

URL_MODULE_MAP是一个数组,每个数组项表示:

'模块映射名'=>'实际模块名'

映射名称不区分大小写,所以设置后,URL访问从原来的:

http://serverName/index.php/Member/index
http://serverName/index.php/Info/index

变成了:

http://serverName/index.php/user/index
http://serverName/index.php/blog/index

并且原来的访问URL是失效的,这也是和定义路由方式改变URL的区别之一。没有定义映射的模块访问不变。
定义了模块映射后,可以通过MODULE_ALIAS常量读取当前模块的URL名称。

2.操作映射

不仅是模块名称可以映射,操作名称也支持映射,而且是针对模块来设置的,操作映射的定义方式为:

'URL_ACTION_MAP'=>array(
  'Member'  => array(
    'register' => 'add',
    ),
  'Info'   => array(
    'list'   => 'index'
    ),
 )

URL_ACTION_MAP参数是一个二维数组,每个数组项表示:

'实际模块名'=>array(
  '操作映射名1'=>'实际操作名1'
  '操作映射名2'=>'实际操作名2'
  ......
 )

操作映射名不区分大小写,如上定义后,URL访问从

http://serverName/index.php/Member/add
http://serverName/index.php/Info/index

变成了(不考虑前面定义的模块映射):

http://serverName/index.php/Member/register
http://serverName/index.php/Info/list

同样,原来的URL地址访问则失效。没有定义映射的操作访问地址不变。
定义了操作映射后,可以通过ACTION_ALIAS常量读取当前操作在URL地址中的操作名。
操作映射和模块映射可以同时定义,没有影响,例如:

'URL_MODULE_MAP'=>array(
  'user'   => 'Member',
 ),
 'URL_ACTION_MAP'=>array(
  'Member'  => array(
    'register888' => 'add',
    ),
 )

则,原来的注册地址

http://serverName/index.php/Member/add

变成了

http://serverName/index.php/user/register888

3.U函数自动支持

可能很多人会担心,在设置了模块和操作映射后,U函数就会出现需要随之改动的情况。其实不需要担心,因为U函数内部已经自动支持了模块和操作映射的情况。
例如,原来在模板文件中使用了

<a href="{:U('Member/add')}">用户注册</a>

无论如何定义Member模块和add操作的映射,U方法的写法始终保持不变,仍然会正确的指向映射后的URL地址。

总结:

模块和操作映射可以用于如下场合:

1、有经常变化URL需要的场合
2、对URL安全性较高的场合
3、需要移植的应用不希望改变URL地址的场合

需要注意的事项:

在使用了模块和操作映射后,对相关URL地址的路由定义可能需要调整

PHP 相关文章推荐
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
Jul 16 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
PHP函数超时处理方法
Feb 14 PHP
PHP实现的简单异常处理类示例
May 04 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
Laravel数据库读写分离配置的方法
Oct 13 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 #PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
Jun 19 #PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 #PHP
php数组合并array_merge()函数使用注意事项
Jun 19 #PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 #PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 #PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
Jun 19 #PHP
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
用JS写的一个TableView控件代码
2010/01/23 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python算法应用实战之栈详解
2017/02/04 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
详解Django的CSRF认证实现
2018/10/09 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
Django model select的多种用法详解
2019/07/16 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
pycharm导入源码的具体步骤
2020/08/04 Python
期末复习计划
2015/01/19 职场文书
工会工作个人总结
2015/03/03 职场文书
开除通知书范本
2015/04/25 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis