解密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 相关文章推荐
学习使用curl采集curl使用方法
Jan 11 PHP
深入PHP autoload机制的详解
Jun 09 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
php生成动态验证码gif图片
Oct 19 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP自定义多进制的方法
Nov 03 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
php实现表单提交上传文件功能
May 28 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 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脚本的10个技巧(8)
2006/10/09 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
如何用Django处理gzip数据流
2021/01/29 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
世界汽车零件:World Car Parts
2019/09/04 全球购物
机械专业毕业生自荐信
2013/11/02 职场文书
工程总经理工作职责
2013/12/09 职场文书
经销商订货会主持词
2014/03/27 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
驻村工作简报
2015/07/20 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL