昨天遇到一个小坑……文档里面说,错误信息可以支持数组定义,当你的错误信息定义为数组信息后,然后再开启 批量认证的开关 ,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' => '邮箱格式错误',
];