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路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...
随机推荐
- spring——bean自动装配
注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...
- Less定义变量
1. 定义: 使用 @ 符号来定义变量 ,在Less中开头是 @ 则是变量,关于变量的命名方法,大家可以参考js中命名的规则,毕竟是做前端的,有着统一的习惯有助于我们统一风格.个人推荐变量名的命名规则 ...
- SQL面试50题
1.查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点) SELECT a.s_id,a.s_score FROM (') as a INNER JOIN (') as b on ...
- c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]
前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...
- JVM调优总结(八)-反思
垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...
- 没找到工作的Java软件工程师是屌丝中的屌丝啊
Java软件开发的工作咋就那么难找呢?
- 第三篇-用Flutter手撸一个抖音国内版,看看有多炫
前言 前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成& 另 ...
- Python每日一练(1)
这两天在做Python的每日一练,感觉收获颇丰,所以来记录分享一下,一共做了三个,涉及socket,PIL,pymysql三个库,另外终于开始了Flask框架的学习,后续也会做出一些分析 第一个是一个 ...
- C/C++代码优化之求两个整型的平均值
在 C/C++ 中, 直接利用 (x + y) >> 1 来计算 \(\left\lfloor {\left( {x + y} \right)/2} \right\rfloor\) (两个 ...
- Rocket - diplomacy - AddressAdjuster分析
https://mp.weixin.qq.com/s/UYVSO3XFJmhe5bUD_XbMLg 先介绍如何使用AddressAdjuster,然后分析UI参数的生成及使用. 1. ...