解密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下通过POST还是GET来传值
Jun 05 PHP
PHP SQLite类
May 07 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
php把时间戳转换成多少时间之前函数的实例
Nov 16 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
PHP实现的用户注册表单验证功能简单示例
Feb 25 PHP
php依赖注入知识点详解
Sep 23 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
QQ登录简单实现代码
2021/03/09 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python实现自动上京东抢手机
2018/02/06 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
夏季奶茶店创业计划书
2014/01/16 职场文书
国庆节慰问信
2015/02/15 职场文书
个人更名证明
2015/06/23 职场文书
五年级作文之想象作文
2019/10/30 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL
js前端图片加载异常兜底方案
2022/06/21 Javascript