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路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
随机推荐
- thinkphp路由简介和设置使用
use think\Route; //静态路由 Route::rule('/', 'index/index/index'); Route::rule('test', 'index/index/test ...
- vue仿移动端输入框
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(1)
1. 数据类型数值范围溢出 如标题所述,该错误出现的原因是由于变量的值超出该数据类型取值范围而导致的错误. 例题如下: (IDE环境:C-Free,编译器为mingw5,如下图) # include ...
- MVC案例之新增与修改Customer
新增Customer 添加的流程Add New Customer 超链接连接到 newcustomer.jsp新建 newcustomer.jsp: 在 CustomerServlet 的 addCu ...
- DQN(Deep Q-learning)入门教程(五)之DQN介绍
简介 DQN--Deep Q-learning.在上一篇博客DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird 中,我们使用Q-Table来 ...
- Spring AMQP:RabbitTemplate SimpleMessageListenerContainer
一.RabbitTemplate介绍 RabbitTemplate:消息模板,在与Spring AMQP整合时,进行发送消息的关键类. 包括了可靠性投递消息方法.回调监听消息接口ConfirmCall ...
- 【大厂面试02期】Redis过期key是怎么样清理的?
PS:本文已收录到1.1K Star数开源学习指南--<大厂面试指北>,如果想要了解更多大厂面试相关的内容,了解更多可以看 http://notfound9.github.io/inter ...
- Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.
这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...
- Qcom rampdump解析工具使用
使用如下命令获取qcom工具: ljj@ljj-ThinkCentre-M83:~/git/qcom_tools/ramdump$ git clone git://codeaurora.org/qui ...
- Java实现 LeetCode 797 所有可能的路径 (DFS)
797. 所有可能的路径 给一个有 n 个结点的有向无环图,找到所有从 0 到 n-1 的路径并输出(不要求按顺序) 二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点(译 ...