今天在前端那边说了一个问题就是他们请求某个参数里面字符串前面明明加了空格,但是提交数据保存刷新后,空格又没了,然后这边就开始排查了问题,使用request()->all()获取参数并打印,发现字符串前面并没有空格,接口也没加一些中间件进行额外的处理,但是使用file_get_contents(‘php://input’)获取原始参数发现字符串前面又有空格了,然后搜了一下说是公共中间件TrimStrings自动去除了空格,如果想要不去除字符串两端的空格的话可以将字段加入到$except,值的话为参数的名称
但是我们的参数有些复杂,是json类型的
data: {
name: ' name ',
list: [
{
id: 1,
text: ' name1 '
},
{
id: 2,
text: ' name2 '
}
]
}
如果我们想要不去除name两端的空格,可以在TrimStrings的$except加上如下这样
$except = [
'data.name'
];
想要不去除的是list中text两端的空格,如果像上面name一样的话,我们需要这样在$except加一下
$except = [
'data.list.0.text',
'data.list.1.text',
];
但是list里面的数据并不是固定数量的,而且就算是固定数量的上述的写法也是不可取的,这时搜了一下看看有没有方法能解决这个问题,搜了一圈没发现,然后按照下面这种自己试了一下也是不行的
$except = [
'data.list.',
'data.list*',
];
是然后就看TrimStrings父类中,如何实现两端去空格的,找到了底层Illuminate\Foundation\Http\Middleware\TrimStrings文件transform方法
protected function transform($key, $value)
{
\Log::info($key);
if (in_array($key, $this->except, true)) {
return $value;
}
return is_string($value) ? trim($value) : $value;
}
然后在方法打印$key的值,打印出来的信息如下 data.name data.list.0.id data.list.0.text data.list.1.id data.list.0.text
从这里我们知道data.list里面的text是上述的添加方式,通过这个方法,我们想要排除data.list里面text字段的话,需要在TrimStrings文件中重写下父类的transform方法,目前只有一个排除字段,问了前端list里面 都不需要去除空格,所以我们可以这样加一下代码
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
protected $except = [
];
protected function transform($key, $value)
{
if(strpos($key,'data.list.') !== false) {
return $value;
}
if (in_array($key, $this->except, true)) {
return $value;
}
return is_string($value) ? trim($value) : $value;
}
}
|