欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解密ThinkPHP3.1.2版本之模块和操作映射

程序员文章站 2022-10-14 09:22:01
模板和操作映射功能是thinkphp3.1.2版本支持的对模块和操作设置的映射机制,由于可以通过改变配置动态改变(实际真正改变,并非别名)url访问地址,加强了应用的安全性...

模板和操作映射功能是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地址的路由定义可能需要调整