解密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 相关文章推荐
拼音码表的生成
Oct 09 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
php explode函数实例代码
Feb 27 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
php中in_array函数用法分析
Nov 15 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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开发中的安全防范知识详解
2013/06/06 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python实现动态数组的示例代码
2019/07/15 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
python中if及if-else如何使用
2020/06/02 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
称象教学反思
2014/02/03 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
绿色校园广播稿
2014/10/13 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers