我有一个雄辩模型,我为此创建了一个自定义toArray()
方法,以包含元表中的字段(我通过使用雄辩元插件获得):
class User extends Model{
// ... Other stuff
public function toArray(){
return array_merge(parent::toArray(), $this->getAllMeta()->toArray());
}
}
当我现在尝试使用 Response::json(...)
将此模型作为 JSON 响应发送时,我得到:
响应中的 UnexpectedValueException.php第 403 行:响应内容必须是实现 __toString() 的字符串或对象 给出"布尔值"。
我已经将错误追溯到JsonResponse.setData($data)
-方法,其中json_encode
-调用返回 false。json_last_error()
-方法返回JSON_ERROR_SYNTAX
,json_last_error_msg()
-方法返回Syntax error
。
使用调试器,我停在下面的行上并自己评估了该语句。正如预期的那样,它不起作用,但是如果我这样称呼它,它可以工作:
json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR);
这将返回我期望的完整、有效的 JSON,没有任何缺失值或 NULL 值。
更奇怪的是,如果我停止toArray()
方法并将合并的数组提供给json_encode
,即使没有部分,它也能正常工作。
我在这里忽略了一些明显的东西吗?
问题出在我使用的雄辩元插件上。这是我问题中的相关部分:
我将错误追溯到
Helpers.maybeDecode($value)
方法:当前实现尝试使用
json_decode($value)
并检查是否有效,通过检查json_last_error()
-函数。问题是,这不会重置 最后一个错误。当调用
Helpers.maybeDecode($value)
方法时,当 Laravel正在对模型进行编码,以及它试图解码的值 不是有效的 JSON(例如,简单的字符串),错误 代码被设置,导致json_encode()
函数看到它并返回null
.问题在于误差变量的全局性质。我建议的解决方法是重置
json_last_error()
-函数在检查解码是否有效后,并且 我发现这样做的唯一方法是解码有效的东西(甚至 如果它只是一个空数组)。
这是带有修复程序的拉取请求。