解密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文件的实现方法
Mar 19 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
PHP多文件上传类实例
Mar 07 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
Vue脚手架的简单使用实例
2018/07/10 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Django的信号机制详解
2017/05/05 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
Python 忽略warning的输出方法
2018/10/18 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
高中生自我评语大全
2014/01/19 职场文书
运动会解说词200字
2014/02/06 职场文书
村居抓节水倡议书
2014/05/19 职场文书
运动会口号16字
2014/06/07 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
项目合作意向书
2015/05/08 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
图神经网络GNN算法
2022/05/11 Python