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

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

via:http://www.thinkphp.cn/document/103.html

时间: 2024-08-11 10:26:22

ThinkPHP3.1新特性:Action参数绑定的相关文章

jdk新特性——可变参数

public class array2{ public static void main(String[] args) { sayHello("beijing","xian"); } private static void sayHello(String ... args) { for (int i = 0; i < args.length; i++) System.out.println("hello," + args[i]+"

mvc action 参数绑定——值提供器【学习笔记】

每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProviderFactory创建的. 在mvc中原生的ValueProviderFactory有六种: ChildActionValueProviderFactory:根据给定的Controller上下文创建一个ChildActionValueProvider对象. FormValueProviderFactor

MVC中Action参数绑定的过程

一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二.Model绑定者 2.1相关说明 http请求中的参数绑定到Model,是由实现了IModelBinder的类来完成的.我们称这样的类叫做Model绑定者 using System; namespace System.Web.Mvc { /// <summary>Defines the metho

ThinkPHP3.2基础教程(37)--控制器-Action参数绑定

参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析. 参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块.控制器和操作名)和操作方法中的参数进行绑定. 要启用参数绑定功能,首先确保你开启了URL_PARAMS_BIND设置: 'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数 参数绑定有两种方式:按照变量名绑定和按照变量顺序绑定. 按变量名绑定 默认的参数绑定方式是按照变量名进行绑定,例如,我们给Bl

[Java5新特性]可变参数

什么是可变参数 Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成: public class Demo { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { int sum1 = new Demo().a

Java新特性--可变参数

可变参数: 1.在传递参数时就可以不受参数个数的限制,全部将参数以数组的形式保存下来. 2.可变参数的定义格式:返回值类型  方法名称(类型...参数名称){},注意:...位于变量类型和变量名之间 3.可参变数的定义必须放在参数列表的后面. 为什么可变参数的定义必须放在参数列表的后面呢? 在没有可变参数这一特性之前,Java是将接受到的参数类型传递给一个数组,用数组的形式,在方法中进行遍历,需要几个元素就添加几个元素(public static void fun(int a[]){}).后来有

ThinkPHP3.1新特性: 多层MVC支持

ThinkPHP基于MVC(Model-View-Controller,模型-视图-控制器)模式,不过均支持多层(multi-Layer)设计. 模型(Model)层:默认的模型层由Model类构成,但是随着项目的增大和业务体系的复杂化,单一的模型层很难解决要求,从3.1开始推出了多层Model的支持,设计思路很简单,不同的模型层仍然都继承自系统的Model类,但是在目录结构和命名规范上做了区分,例如在某个项目设计中需要区分数据层.逻辑层.服务层等不同的模型层,我们可以在项目的Lib目录下面创建

JDK5.0新特性-可变参数

可变参数: 格式 类型... 变量 本质上这个参数是一个数组. 优点:1.传参数时可以传递数组,也可以传递多个值. 2.可以不传递值. Arrays.asList()可以将数组转换成List集合. 注意:得到的是一个固定长度的List集合. 原因:是因为数组长度是固定的,这个集合是由数组转换成的. 为什么要将数组转换成集合? 集合中提供更丰富的操作. int[] arr = { 1, 2, 3 }; List list = Arrays.asList(arr); System.out.print

JDK5新特性--可变参数

1.可变参数的引入 package cn; /**  * 可变参数  */ public class ChangeParameterDemo { public static void main(String[] args) { //2个数求和 int a = 10; int b = 20; int result = sum(a,b); System.out.println("result:"+result); int c = 30; result = sum(a,b,c); Syste