Thinkphp6.X,8.0中验证器的一个开启批量验证的BUG

文章讲述了在ThinkPHP框架中遇到的关于错误信息数组处理的问题,当错误信息定义为数组并开启批量验证时,会导致Arraytostringconversion错误。解决方案包括修改核心代码使用json_encode或将错误内容定义为字符串。
摘要由CSDN通过智能技术生成

ThinkPHP官方手册

昨天遇到一个小坑……文档里面说,错误信息可以支持数组定义,当你的错误信息定义为数组信息后,然后再开启 批量认证的开关 ,batch = true ,你就会收到 Array to string conversion 的错误信息。

检查后发现,在 vendor/topthink/framework/src/think/exception/alidateException.php

这个文件中,

$this->message = is_array($error) ? implode( PHP_EOL , $error) : $error;

这一句,用 implode 来把数组拼接成字符串,问题就出在这里。

如果此前的错误信息不是数组的时候,开启批量认证后,这里会得到一维数组,这里不会出错。

但是如果把错误信息定义为一组数组后,这里得到的错误就是一组二维数组,

二维数组是没办法直接用 implode 来拼接的。

目前的临时解决方法:

找到核心代码:vendor/topthink/framework/src/think/exception/alidateException.php

$this->message = is_array($error) ? implode( PHP_EOL , $error) : $error;

把上面这句,改成:

$this->message = is_array($error) ? json_encode($error) : $error;

如果不想修改核心代码,不要把错误的内容设置为数组(如果不开启批量验证没事,开启了就会出错)

protected $message = [
      'name.require' => ['code' => 1001, 'msg' => '名称必须'],
      'name.max'     => ['code' => 1002, 'msg' => '名称最多不能超过25个字符'],
      'age.number'   => ['code' => 1003, 'msg' => '年龄必须是数字'],
      'age.between'  => ['code' => 1004, 'msg' => '年龄必须在1~120之间'],
      'email'        => ['code' => 1005, 'msg' =>'邮箱格式错误'],
    ];

用下面这种,直接把错误内容定义为字符串即可。

protected $message = [
      'name.require' => '名称必须',
      'name.max'     => '名称最多不能超过25个字符',
      'age.number'   => '年龄必须是数字',
      'age.between'  => '年龄必须在1~120之间',
      'email'        => '邮箱格式错误',
    ];
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值