• Laravel关于TrimStrings请求参数去空格问题


    今天在前端那边说了一个问题就是他们请求某个参数里面字符串前面明明加了空格,但是提交数据保存刷新后,空格又没了,然后这边就开始排查了问题,使用request()->all()获取参数并打印,发现字符串前面并没有空格,接口也没加一些中间件进行额外的处理,但是使用file_get_contents(‘php://input’)获取原始参数发现字符串前面又有空格了,然后搜了一下说是公共中间件TrimStrings自动去除了空格,如果想要不去除字符串两端的空格的话可以将字段加入到$except,值的话为参数的名称

    但是我们的参数有些复杂,是json类型的

    data: {
          name: '  name   ',
          list: [
             {
                 id: 1,
                 text: ' name1 '
             },
             {
                  id: 2,
                 text: ' name2 '
             }
         ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果我们想要不去除name两端的空格,可以在TrimStrings的$except加上如下这样

     $except = [
         'data.name'
     ];
    
    • 1
    • 2
    • 3

    想要不去除的是list中text两端的空格,如果像上面name一样的话,我们需要这样在$except加一下

     $except = [
          'data.list.0.text',
          'data.list.1.text',
     ];
    
    • 1
    • 2
    • 3
    • 4

    但是list里面的数据并不是固定数量的,而且就算是固定数量的上述的写法也是不可取的,这时搜了一下看看有没有方法能解决这个问题,搜了一圈没发现,然后按照下面这种自己试了一下也是不行的

     $except = [
          'data.list.',
          'data.list*',
     ];
    
    • 1
    • 2
    • 3
    • 4

    是然后就看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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后在方法打印$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里面
    都不需要去除空格,所以我们可以这样加一下代码

    
    
    namespace App\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
    
    class TrimStrings extends Middleware
    {
        /**
         * The names of the attributes that should not be trimmed.
         *
         * @var array
         */
        protected $except = [
        ];
    
        /**
         * 重写父类方法,不去除指定json字段内字符串两端空格
         * @param string $key
         * @param mixed $value
         * @return mixed|string
         */
        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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    【java学习】项目: ATM系统
    安卓设备监听全部输入信号
    计算机竞赛 深度学习人体语义分割在弹幕防遮挡上的实现 - python
    C++STL——vector的模拟实现(代码+解析)
    C#可空类型
    html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法
    网络观察方法
    逆向-还原代码之url_encode (Arm 64)
    Zookeeper部署运行_伪集群安装
    银行应用程序应该遵循什么方法来测试?测试银行应用程序所涉及的各个阶段和技术讲解
  • 原文地址:https://blog.csdn.net/qq_37604998/article/details/126749620