我有一个Eloquent模型,为此创建了一个自定义toArray()
- 方法,以包含元表中的字段(我使用eloquent-meta插件获得):
class User extends Model{
// ... Other stuff
public function toArray(){
return array_merge(parent::toArray(), $this->getAllMeta()->toArray());
}
}
当我现在尝试使用Response::json(...)
将此模型作为JSON响应发送时,我得到:
Response.php第403行中的UnexpectedValueException :响应内容必须是实现__toString()的字符串或对象, "布尔"给出。
我已将错误追踪到JsonResponse.setData($data)
-method,其中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
,它就可以正常工作,即使不是部分的。
我是否忽视了一些明显的东西?
答案 0 :(得分:2)
问题在于我使用的eloquent-meta插件。这是my issue的相关部分:
我将错误追溯到了
Helpers.maybeDecode($value)
-method:当前实现尝试使用解析值
json_decode($value)
并通过检查确认是否有效json_last_error()
- 功能。问题是,这并没有重置 最后一个错误。调用
Helpers.maybeDecode($value)
- 方法时, while Laravel是编码模型,以及它尝试解码的值 是不一个有效的json(例如,一个简单的字符串),错误 代码已设置,导致json_encode()
- 函数查看并返回null
。问题在于错误变量的全局性。我建议的解决方法是重置
json_last_error()
- 检查装饰是否有效后的功能,以及 我发现这样做的唯一方法是通过解码有效的东西(甚至 如果它只是一个空数组。)
以下是修复的Pull Request。