tp6 路由匹配参数获取问题
tp6是一个封装度很高的框架,在大部分场景下都能做到开箱即用
本次遇到情况为,当请求消息体为索引数组时,路由参数无法正常获取
首先看正常路由匹配
路由定义
Route::post('test/:a/:b', 'index/test');
Index控制器输出参数
public function test($a, $b)
{
dump($a, $b);
}
请求测试,如下图我们得到了我们所需要的结果

这时将IndexController->test中`$a, $b`参数调换位置(路由不变)
public function test($b, $a)
{
dump($a, $b);
}
这时重新请求,得到的结果依然不变

那么我们是否可以得到结论:tp6控制器参数会根据路由参数名自动匹配?
看以上结果好像是没问题,但是有个大坑!
请求体正文中加入数组内容
路由,控制器输出方法都不变,仅增加requestBody,得到如下结果

说好的路由匹配呢!
原因说明
在方法中打印出`request->param()`可查看到刚才的请求最终得到的参数
array:4 [
0 => 3
1 => 4
"a" => "1"
"b" => "2"
]
可以看到消息体中参数是索引数组部分,而a b为关联数组部分
tp在最终匹配action参数的时候,按照先分配索引,再分配关联的顺序进行了参数传入,导致没有得到我们想要的效果
若消息体内增加键值,我们重新尝试,如下图依然是我们想要的结果

所以大概得到结论:param()参数的来源为先获取query、body等参数,再覆盖上路由参数
解决方案
既然已经知道原因,那么解决方案就比较好处理了
方案1
更改消息体,避免直接使用索引数组传递,如

我们在方法内根据键值data即可获取想要的数据
方案2
不需要更改结构体,但action参数不通过传入参数获取,由内部自己获取
// action代码如下
public function test()
{
$a = $this->request->param('a');
$b = $this->request->param('b');
dump($a, $b);
dump($this->request->param());
}
使用原消息体测试

总结
根据结果,不能说这是tp的BUG,可以说这次问题是不熟悉导致,但也算是一个坑吧,在遇到这种情况下确实容易摸不着头脑
大家项目内使用时多多注意即可~
tp6 路由匹配参数获取问题的更多相关文章
- Flask自定义转换器,实现路由匹配正则表达式参数
Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...
- AngularJS路由系列(4)-- UI-Router的$state服务、路由事件、获取路由参数
本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router的$state服务● UI-Router的路由事件● UI-Router获取路由参数 Angular ...
- ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制
我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...
- vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面
vue如何配置路由 .获取路由的参数.部分刷新页面.缓存页面:http://www.mamicode.com/info-detail-1941546.html vue-router传递参数的几种方式: ...
- WebAPI路由、参数绑定
一.测试Web API a)测试Web API可以用来检测请求和返回数据是否正常,可以使用Fiddler.Postman等工具.以Fiddler为例,这是一个http协议调试代理工具,它能够记录客 ...
- ASP.NET Core 中的SEO优化(3):自定义路由匹配和生成
前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用: <ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存> <ASP.NET ...
- django urls路由匹配分发
django urls路由匹配分发 一.urls配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对 ...
- .ashx 实现自动路由和参数填充
在Mvc中访问控制器,参数填充和路由控制都非常方便,但之前项目用的是webFrom,和js交互的ashx页面,路由非常麻烦要根据传进来关键字来做switch,参数填充更坑,要一个一个去form中取出来 ...
- django路由匹配层
目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
随机推荐
- Win10上禁用Device Guard以便运行VMware
Win10上每次大版本升级后,如果你试图运行VMware,都会提示如下的错误信息: “VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Devi ...
- PHP关于syntax error语法错误的问题(Parse error: syntax error, unexpected end of file in xxxxxxxx)
在php程序出现类似 Parse error: syntax error, unexpected end of file in xxxxxxxx on line xx 的错误. 如图 如果发现php ...
- Codeblocks运行按钮变灰,卡程序编译
实际上,当我们点击绿色运行按钮运行之后,.exe文件会开始运行,当我们点击红色调试按钮之后,会开始调试. 因此当我们在运行卡住之后,点击红色调试按钮,实际上并没有真正的结束程序,只是将窗口隐藏起来,我 ...
- 实验四:Linux系统C语言开发环境学习
项目 内容 这个作业属于哪个课程 班级课程主页链接 这个作业的要求在哪里 作业要求 学号-姓名 17043133-木腾飞 作业学习要求 1.学习Linux系统中如何查看帮助文档:2.在Linux系统中 ...
- C# 数据操作系列 - 17 Dapper ——号称可以与ADO.NET 同台飙车的ORM
0. 前言 之前四篇介绍了一个国内开发者开发的优秀框架SqlSugar,给我们眼前一亮的感觉.这一篇,我们将试试另一个出镜率比较高的ORM框架-Dapper. Dapper是一个轻量级的ORM框架,其 ...
- DQN(Deep Q-learning)入门教程(三)之蒙特卡罗法算法与Q-learning算法
蒙特卡罗法 在介绍Q-learing算法之前,我们还是对蒙特卡罗法(MC)进行一些介绍.MC方法是一种无模型(model-free)的强化学习方法,目标是得到最优的行为价值函数\(q_*\).在前面一 ...
- 离散的差分进化Discrete DE
一般的差分算法的变异规则:Xmutation=Xr1+F(Xr2-Xr3),F为缩放因子, 离散差分进化DDE的变异规则:设每个解为K个元素的集合,则Xr2-Xr3:求出Xr2与Xr3有m个共同元素, ...
- 舵机MX-64AR与MX-28AR驱动
背景:硬件采用485通信,在tb上采购的无需收发控制的串口转RS485模块(485通信为半双工,一般情况需要控制收发模式).在使用该模块后,即可完全使用一个普通地串口来对485通信的舵机进行操作. 模 ...
- Rocket - debug - TLDebugModuleInner - DMI Register Control and Status
https://mp.weixin.qq.com/s/tI41wu0xaIQ5PRq6F82tNw 简单介绍TLDebugModuleInner中生成DMI控制和状态寄存器使用到的状态. 1. abs ...
- Rocket - tilelink - CacheCork
https://mp.weixin.qq.com/s/QsL1Bfb0JsOaxWW_muhg_Q 简单介绍CacheCork的实现. 1. 基本介绍 Cache的塞子,下游没有 ...