参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。

参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定。

要启用参数绑定功能,首先确保你开启了URL_PARAMS_BIND设置:

  1. 'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数

参数绑定有两种方式:按照变量名绑定和按照变量顺序绑定

按变量名绑定

默认的参数绑定方式是按照变量名进行绑定,例如,我们给Blog控制器定义了两个操作方法read和archive方法,由于read操作需要指定一个id参数,archive方法需要指定年份(year)和月份(month)两个参数,那么我们可以如下定义:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class BlogController extends Controller{
  4. public function read($id){
  5. echo 'id='.$id;
  6. }
  7. public function archive($year='2013',$month='01'){
  8. echo 'year='.$year.'&month='.$month;
  9. }
  10. }

注意这里的操作方法并没有具体的业务逻辑,只是简单的示范。

URL的访问地址分别是:

  1. http://serverName/index.php/Home/Blog/read/id/5
  2. http://serverName/index.php/Home/Blog/archive/year/2013/month/11

两个URL地址中的id参数和year和month参数会自动和read操作方法以及archive操作方法的同名参数绑定。

变量名绑定不一定由访问URL决定,路由地址也能起到相同的作用

输出的结果依次是:

  1. id=5
  2. year=2013&month=11

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

  1. http://serverName/index.php/Home/Blog/archive/month/11/year/2013

和上面的访问结果是一致的,URL中的参数顺序和操作方法中的参数顺序都可以随意调整,关键是确保参数名称一致即可。

如果使用下面的URL地址进行访问,参数绑定仍然有效:

  1. http://serverName/index.php?s=/Home/Blog/read/id/5
  2. http://serverName/index.php?s=/Home/Blog/archive/year/2013/month/11
  3. http://serverName/index.php?c=Blog&a=read&id=5
  4. http://serverName/index.php?c=Blog&a=archive&year=2013&month=11

如果用户访问的URL地址是(至于为什么会这么访问暂且不提):

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

那么会抛出下面的异常提示: 参数错误:id

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

  1. public function read($id=0){
  2. echo 'id='.$id;
  3. }

这样,当我们访问 http://serverName/index.php/Home/Blog/read/ 的时候 就会输出

  1. id=0

当我们访问 http://serverName/index.php/Home/Blog/archive/ 的时候,输出:

  1. year=2013&month=01

始终给操作方法的参数定义默认值是一个避免报错的好办法

按变量顺序绑定

第二种方式是按照变量的顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整。要按照变量顺序进行绑定,必须先设置URL_PARAMS_BIND_TYPE为1:

  1. 'URL_PARAMS_BIND_TYPE' => 1, // 设置参数绑定按照变量顺序绑定

操作方法的定义不需要改变,URL的访问地址分别改成:

  1. http://serverName/index.php/Home/Blog/read/5
  2. http://serverName/index.php/Home/Blog/archive/2013/11

输出的结果依次是:

  1. id=5
  2. year=2013&month=11

这个时候如果改成

  1. http://serverName/index.php/Home/Blog/archive/11/2013

输出的结果就变成了:

  1. year=11&month=2013

显然就有问题了,所以不能随意调整参数在URL中的传递顺序,要确保和你的操作方法定义顺序一致。

大理石平台价格

可以看到,这种参数绑定的效果有点类似于简单的规则路由。

按变量顺序绑定的方式目前仅对PATHINFO地址有效,所以下面的URL访问参数绑定会失效:

  1. http://serverName/index.php?c=Blog&a=read&id=5
  2. http://serverName/index.php?c=Blog&a=archive&year=2013&month=11

但是,兼容模式URL地址访问依然有效:

  1. http://serverName/index.php?s=/Home/Blog/read/5
  2. http://serverName/index.php?s=/Home/Blog/archive/2013/11

如果你的操作方法定义都不带任何参数或者不希望使用该功能的话,可以关闭参数绑定功能:

  1. 'URL_PARAMS_BIND' => false

thinkphp action参数绑定的更多相关文章

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

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

  2. action参数绑定

    thinkPHP支持操作方法的参数绑定功能 action参数通过直接绑定URL中的变量作为操作方法的参数,可以简化方法的定义甚至路由的简析. 原理是把URL的中参数(不包括模块,控制器和操作名)和控制 ...

  3. MVC中Action参数绑定的过程

    一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...

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

    每次http请求的各种数据(表单数据.url的数据.路由数据等等)都保存在不同的IValueProvider接口的实现类中. 而IValueProvider接口的实现类是通过ValueProvider ...

  5. thinkphp模拟请求和参数绑定

    thinkphp模拟请求和参数绑定 一.总结 1.网页传过来的参数是可以修改的:get或者post等方式 传过来的参数是可以修改的  dump($request->get(['id'=>2 ...

  6. ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例

    在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...

  7. NopCommerce架构分析之五------Model绑定Action参数

    asp.net MVC中Action参数不只是一些基本类型,也支持实体参数.那么从客户端传来的数据如何映射或转换成实体对象呢?就是通过实体绑定类ModelBinder.此系列类在请求转化为后台Cont ...

  8. ThinkPHP 参数绑定原理

    ThinkPHP里有一个参数绑定的功能 想自己试着写一个类似的 主要利用到PHP里的反射的API <?php class Index { public function edit($id=0) ...

  9. ASP.NET Core 2.2 十九. Action参数的映射与模型绑定

    前文说道了Action的激活,这里有个关键的操作就是Action参数的映射与模型绑定,这里即涉及到简单的string.int等类型,也包含Json等复杂类型,本文详细分享一下这一过程.(ASP.NET ...

随机推荐

  1. 如何去实现一个运用于多平台的SDK ?

    开始要求实现一个SDk的时候,一脸懵逼,以前总是调别人的SDK暴露的接口与方法,现在自己去实现一个,可以用到各平台上,还是相当有难度的,经过大半月的研究还是有点眉目的,想在这里和大家分享一下鄙人简陋的 ...

  2. Bribing FIPA

    Bribing FIPA 给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\ ...

  3. 二进制中1的个数(Java实现)

    问题: 输入一个整数,求其二进制中1的个数 看到这个问题,我们应该想到数的位运算: 解法一:我们每次将此数&1 ,如果结果等于1,证明此数的最后一位是1,,count++: 然后在将数右移一位 ...

  4. vue-cli3+ant-design-vue+typescript 注意事项

    项目参考vue-cli3-web-init ant-design配置部分 1. 实现ant-disign-vue的按需加载方案 (1)引入所有的组件,然后加载到vue上面 components-ant ...

  5. android高级篇收录

    Android运行时性能优化 1.android启动优化 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端 ...

  6. CUDA并行计算 | CUDA算法效率提升关键点概述

    文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言   CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...

  7. nginx、php-fpm安装mongodb及驱动扩展

    1.安装mongodb linux下安装mongodb很简单,执行如下命令完成安装 wget http://downloads.mongodb.org/linux/mongodb-linux-i686 ...

  8. POJ2186-Tarjan-kosaraju-缩点

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  A认为B优秀,B认为C优秀,则A认为C优秀.问有多少个人被其他所有人 ...

  9. 【转】Linux(CentOS) vps安装xfce桌面+VNC

    以前我发过一篇文章利用vnc远程连接VPS桌面,其中用到的是kde桌面,后来知道xfce总体来说比kde占得内存还小些,因为xfce轻便.简单,今天因为一些原因需要在我的vps上搭建用户桌面,所以就试 ...

  10. RCC, Reset and Clock Control