解密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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
PHP session常见问题集锦及解决办法总结
Mar 18 PHP
php中文字符截取防乱码
Mar 28 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
php返回json数据函数实例
Oct 09 PHP
smarty简单分页的实现方法
Oct 27 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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正则提取或替换img标记属性
2013/06/26 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
JavaScript错误处理
2015/02/03 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
Python中用altzone()方法处理时区的教程
2015/05/22 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
解决Django连接db遇到的问题
2019/08/29 Python
Python requests接口测试实现代码
2020/09/08 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
数据库面试要点基本概念
2013/10/31 面试题
自荐信格式
2013/12/01 职场文书
主持人演讲稿范文
2013/12/28 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
售后服务承诺书模板
2014/05/21 职场文书
求职自我推荐信
2014/06/25 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
python入门之算法学习
2021/04/22 Python
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android