ThinkPHP3.1新特性之Action参数绑定


Posted in PHP onJune 19, 2014

ThinkPHP3.1版的Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法。这一新特性对以往的操作方法使用没有任何影响,你也可以用新的方式来改造以往的操作方法定义。

Action参数绑定的原理是把URL中的参数(不包括分组、模块和操作地址)和控制器的操作方法中的参数进行绑定。例如,我们给Blog模块定义了两个操作方法read和archive方法,由于read操作需要指定一个id参数,archive方法需要指定年份(year)和月份(month)两个参数。

class BlogAction extends Action{
  public function read($id){
    echo 'id='.$id;
    $Blog = M('Blog');
    $Blog->find($id);
  }
  public function archive($year='2012',$month='01'){
    echo 'year='.$year.'&month='.$month;
    $Blog = M('Blog');
    $year  =  $year;
    $month =  $month;
    $begin_time = strtotime($year . $month . "01");
    $end_time = strtotime("+1 month", $begin_time);
    $map['create_time'] = array(array('gt',$begin_time),array('lt',$end_time));
    $map['status'] =  1;
    $list = $Blog->where($map)->select();
  }
 }

URL的访问地址分别是:

http://serverName/index.php/Blog/read/id/5
http://serverName/index.php/Blog/archive/year/2012/month/03

两个URL地址中的id参数和year和month参数会自动和read操作方法以及archive操作方法的同名参数绑定。
输出的结果依次是:

id=5
year=2012&month=03

Action参数绑定的参数必须和URL中传入的参数名称一致,但是参数顺序不需要一致。也就是说

http://serverName/index.php/Blog/archive/month/03/year/2012

和上面的访问结果是一致的,URL中的参数顺序和操作方法中的参数顺序都可以随意调整,关键是确保参数名称一致即可。
如果用户访问的URL地址是(至于为什么会这么访问暂且不提):

http://serverName/index.php/Blog/read/

那么会抛出下面的异常提示:

参数错误:id

报错的原因很简单,因为在执行read操作方法的时候,id参数是必须传入参数的,但是方法无法从URL地址中获取正确的id参数信息。由于我们不能相信用户的任何输入,因此建议你给read方法的id参数添加默认值,例如:

  

public function read($id=0){
    echo 'id='.$id;
    $Blog = M('Blog');
    $Blog->find($id);
  }

这样,当我们访问

http://serverName/index.php/Blog/read/

的时候 就会输出

id=0

当我们访问

http://serverName/index.php/Blog/archive/

的时候,输出:

year=2012&month=01
PHP 相关文章推荐
PHP中Session的概念
Oct 09 PHP
PHP排序算法的复习和总结
Feb 15 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
php去除html标记的原生函数详解
Jan 27 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
php PDO异常处理详解
Nov 20 PHP
使用phpQuery获取数组的实例
Mar 13 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
Oct 31 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 #PHP
php定界符
Jun 19 #PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 #PHP
PHP两种去掉数组重复值的方法比较
Jun 19 #PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 #PHP
ThinkPHP3.1基础知识快速入门
Jun 19 #PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 #PHP
You might like
php 类自动载入的方法
2015/06/03 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
javascript 写类方式之一
2009/07/05 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
js评分组件使用详解
2017/06/06 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
JS实现简单日历特效
2020/01/03 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
python中返回矩阵的行列方法
2018/04/04 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
服务型党组织建设典型材料
2014/05/07 职场文书
爱心募捐感谢信
2015/01/22 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2016年母亲节广告语
2016/01/28 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
解除租赁合同协议书
2016/03/21 职场文书